Browse Source

srh rewrites

windhamdavid 1 week ago
parent
commit
83618a4abd
1 changed files with 149 additions and 0 deletions
  1. 149 0
      docs/srh.md

+ 149 - 0
docs/srh.md

@@ -226,6 +226,8 @@ Important Notes:
 
 
 ---
 ---
 
 
+<div><br/><br/></div>
+
 ## CURRENT CONFIG
 ## CURRENT CONFIG
 
 
 **note** the ```underscores_in_header``` directive is required and the ```sub_filter``` module is not available in the current nginx build. 
 **note** the ```underscores_in_header``` directive is required and the ```sub_filter``` module is not available in the current nginx build. 
@@ -349,4 +351,151 @@ location ~ ^/(app/providers|/-/providers) {
 		rewrite ^.*(app\/providers|\/-\/providers)(.*)$ https://providers.selfregional.org/providers$2 break;
 		rewrite ^.*(app\/providers|\/-\/providers)(.*)$ https://providers.selfregional.org/providers$2 break;
 	}
 	}
 }
 }
+```
+
+---
+
+<div><br/><br/></div>
+
+## DEBUG LINK ERROR
+
+Epic team found an error where the "bio links from the slots are incorrect" ( the popup window links for each provider above the scheduling time ). The current error is from a redirect loop causing a ```499``` 'Client Closed Request' error. I found that even before the proxy, the url is change and replaces the ```CustomHostID``` with the ```MyChartSiteName``` ( ```MySelfRegional``` -> ```MySRHTST``` ) e.g.:  
+
+https://mychart-np.et1235.epichosted.com/MySelfRegional/app/providers/details?id=WP-24ZbgpnUzW4-2B-2Fz8NuLocNwBA-3D-3D-24sJ0udur53-2FhX6H4Z4O26dH2yxiAz4AP1Nk8QQ7Vkiug-3D  
+๐Ÿ‘‡๐Ÿผ โ™ป๏ธ  
+https://mychart-np.et1235.epichosted.com/MySRHTST/app/providers/details?id=WP-24ZbgpnUzW4-2B-2Fz8NuLocNwBA-3D-3D-24sJ0udur53-2FhX6H4Z4O26dH2yxiAz4AP1Nk8QQ7Vkiug-3D
+
+
+I also noticed that even when the link switches out the ```CustomHostID``` with the ```MyChartSiteName``` it still does not function and only functions when the ```CustomHostID``` is completely removed. e.g.:  
+
+https://providers.selfregional.org/MySelfRegional/app/providers/details?id=WP-24ZbgpnUzW4-2B-2Fz8NuLocNwBA-3D-3D-24sJ0udur53-2FhX6H4Z4O26dH2yxiAz4AP1Nk8QQ7Vkiug-3D  
+๐Ÿ‘‡๐Ÿผ โŒ  
+https://providers.selfregional.org/MySRHTST/app/providers/details?id=WP-24ZbgpnUzW4-2B-2Fz8NuLocNwBA-3D-3D-24sJ0udur53-2FhX6H4Z4O26dH2yxiAz4AP1Nk8QQ7Vkiug-3D  
+๐Ÿ‘‡๐Ÿผ โœ…  
+https://providers.selfregional.org/app/providers/details?id=WP-24ZbgpnUzW4-2B-2Fz8NuLocNwBA-3D-3D-24sJ0udur53-2FhX6H4Z4O26dH2yxiAz4AP1Nk8QQ7Vkiug-3D
+
+
+So we need to remove ```/MySelfRegional/``` from the 'bio link in slots' ( the ```.providerBioLink``` class ). I suspect the 'Hosted Provider Finder' and 'Canonical URL' translations are the culprit since it's designed to replace the ```CustomHostID``` with the ```MyChartSiteName``` for certain HTML tags. The 'Canonical URL' rule is explicitly set to rewrite links via ```filterByTags="Link"```. Here are the two IIS rules from the documentation:
+
+```xml
+<rule name="Hosted Provider Finder Example" preCondition="Hosted Provider Finder Precondition" enabled="true" patternSyntax="Wildcard">
+  <match filterByTags="Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script, CustomTags" customTags="Hosted Provider Finder Collection" pattern="/MyChartSiteName/*" negate="false" />
+  <action type="Rewrite" value="/CustomHostID/{R:1}" />
+</rule>
+<preCondition name="Hosted Provider Finder Precondition">
+  <add input="{REQUEST_URI}" pattern="/-/providers" />
+  <add input="{QUERY_STRING}" pattern="host=" />
+</preCondition>
+<customTags>
+  <tags name="Hosted Provider Finder Collection">
+      <tag name="meta" attribute="content" />
+      <tag name="use" attribute="xlink:href" />
+  </tags>
+</customTags>
+
+<rule name="Provider Finder Canonical URL Rewrite Example" preCondition="Provider Finder Canonical URL Precondition">
+  <match filterByTags="Link" pattern="^https?:\/\/[^ ]*(app\/providers|\/-\/providers)([^ ]*)/" />
+  <action type="Rewrite" value=" CustomDomain/CustomProviderFinder {R:2}" />
+ </rule>
+<preCondition name="Provider Finder Canonical URL Precondition" logicalGrouping="MatchAny">
+  <add input="{REQUEST_URI}" pattern="(\/app\/providers|\/-\/providers)" />
+  <add input="{QUERY_STRING}" pattern="host=" />
+</preCondition>
+```
+
+As noted in the original translation, these rules depend on a custom nginx module. So I recompiled nginx with the ```--with-http_sub_module``` in order to use the ```sub_filter``` module to test. Here's the build:
+
+```sh
+************@mdev:~ ยป nginx -V
+nginx version: nginx/1.26.3
+built with OpenSSL 3.0.7 1 Nov 2022 (running with OpenSSL 3.2.2 )
+TLS SNI support enabled
+configure arguments: --prefix=/usr/share --sbin-path=/usr/sbin/nginx 
+--conf-path=/etc/nginx/nginx.conf --modules-path=/usr/share/nginx/modules 
+--error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log 
+--lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body 
+--http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy 
+--http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi 
+--user=nginx --group=nginx --with-file-aio --with-compat 
+--with-ld-opt=-L/var/jenkins/workspace/unix/plesk/packages/brotli/brotli.files/usr/lib64
+--with-http_ssl_module --with-http_realip_module 
+// highlight-next-line
+--with-http_sub_module 
+--with-http_dav_module --with-http_gzip_static_module --with-http_stub_status_module 
+--with-http_v2_module --with-http_v3_module --add-dynamic-module=mod_brotli 
+--add-dynamic-module=mod_passenger/src/nginx_module --add-dynamic-module=mod_pagespeed
+--add-dynamic-module=mod_security --add-dynamic-module=mod_geoip2
+```
+
+
+
+I translated the rule again several times, tested, and discovered:
+
+- Nginx's ```sub_filter``` module cannot target specific HTML tags or attributes like IIS
+- Can NOT wrap the ```sub_filter``` in an ```if``` statement
+- In order to use tag/attribute-specific replacements, we would need Nginx with the Lua module (OpenResty) or a
+a proxy layer that can modify HTML like Node.js
+
+
+
+
+```sh
+location ~ ^/(app/providers|/-/providers)(.*)$ {
+    # Apply to HTML
+    sub_filter_types text/html;
+    # Apply sub_filter for all requests to this location
+    sub_filter '/MySelfRegional/' '/MySRHTST/';
+    # Repeat for all instances
+    sub_filter_once off;
+    proxy_set_header Host $host;
+    proxy_set_header X-Real-IP $remote_addr;
+    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+    proxy_set_header X-Forwarded-Proto $scheme;
+    proxy_pass https://mychart-np.et1235.epichosted.com;
+
+}
+```
+
+In order to use tag/attribute-specific replacements, we would need Nginx with the Lua module (OpenResty) or a
+a proxy layer that can modify HTML (like Node.js middleware) Here's an example rule:
+
+```sh
+# Using OpenResty/Nginx+Lua for more precise filtering
+
+# Define lua function for HTML transformation
+init_by_lua_block {
+    function modify_provider_urls(content)
+        -- Use regex to find and modify only URLs in link tags
+        return string.gsub(content, '<link[^>]+href="(https?://[^"]*)(app/providers|/-/providers)([^"]*)"', 
+                                    '<link href="https://providers.selfregional.org%3"')
+    end
+}
+
+map $request_uri$query_string $provider_finder_condition {
+    "~(\/app\/providers|\/-\/providers)" 1;
+    "~host=" 1;
+    default 0;
+}
+
+location ~ ^/(app/providers|/-/providers) {
+    proxy_pass https://mychart-np.et1235.epichosted.com;
+    
+    header_filter_by_lua_block {
+        if ngx.var.provider_finder_condition == "1" and 
+           ngx.header.content_type and 
+           string.find(ngx.header.content_type, "text/html") then
+            ngx.header.content_length = nil
+        end
+    }
+    
+    body_filter_by_lua_block {
+        if ngx.var.provider_finder_condition == "1" and 
+           ngx.header.content_type and 
+           string.find(ngx.header.content_type, "text/html") then
+            local chunk = ngx.arg[1]
+            local modified_chunk = modify_provider_urls(chunk)
+            ngx.arg[1] = modified_chunk
+        end
+    }
+}
 ```
 ```