asp.net – IIS作为反向代理 – 从后端服务器压缩重写的响应
我正在为后端服务器实现路由请求的反向代理。
功能上一切正常,但是我担心后端服务器的所有响应都不会压缩到客户端(Web浏览器)。 设置如下: >后端服务器,不能公开访问内部域。在https://internal.app上托管网络应用程序 我想以一种对客户端透明的方式将所有请求路由到https://site.com/app/WHATEVER到https://internal.app/WHATEVER。 我当前的设置是基于URL Rewrite 2.0和应用程序请求路由IIS扩展。一般方法基于以下文章的指导原则: > Setting up a Reverse Proxy using IIS,URL Rewrite and ARR site.com应用的web.config的相关部分: <system.webServer> <rewrite> <rules> <rule name="Route the requests for backend app" stopProcessing="true"> <match url="^app/(.*)" /> <conditions> <add input="{CACHE_URL}" pattern="^(https?)://" /> </conditions> <action type="Rewrite" url="{C:1}://internal.app/{R:1}" /> <serverVariables> <set name="HTTP_ACCEPT_ENCODING" value="" /> </serverVariables> </rule> </rules> <outboundRules> <rule name="RewriteBackendAbsoluteUrlsInResponse" preCondition="ResponseIsHtml1"> <match filterByTags="A,Area,Base,Form,Frame,Head,IFrame,Img,Input,Link,Script" pattern="^http(s)?://internal.app(:80)?/(.*)" /> <action type="Rewrite" value="/app/{R:3}" /> </rule> <rule name="RewriteBackendAbsoluteUrlsInRedirects" preCondition="ResponseIsHtml1"> <match serverVariable="RESPONSE_LOCATION" pattern="^http(s)?://internal.app(:80)?/(.*)" /> <action type="Rewrite" value="/app/{R:3}" /> </rule> <rule name="RewriteBackendRelativeUrlsInResponse" preCondition="ResponseIsHtml1"> <match filterByTags="A,Script" pattern="^/(.*)" negate="false" /> <conditions> <add input="{URL}" pattern="^/app/.*" /> </conditions> <action type="Rewrite" value="/app/{R:1}" /> </rule> <rule name="RewriteBackendRelativeUrlsInRedirects" preCondition="ResponseIsHtml1"> <match serverVariable="RESPONSE_LOCATION" pattern="^/(.*)" negate="false" /> <conditions> <add input="{URL}" pattern="^/app/.*" /> </conditions> <action type="Rewrite" value="/app/{R:1}" /> </rule> <preConditions> <preCondition name="ResponseIsHtml1"> <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" /> </preCondition> </preConditions> </outboundRules> </rewrite> <urlCompression dynamicCompressionBeforeCache="false" /> </system.webServer> 问题是,一旦我停止清除HTTP_ACCEPT_ENCODING服务器变量,与上述规则匹配的每个请求都会以以下错误结束:HTTP错误500.52 – URL重写模块错误。 我知道this thread,我已经遵循了这些说明。我已经设置了dynamicCompressionBeforeCache =“false”,如上所述,我已经添加了必要的注册表项,我确信这些模块在IIS中的顺序是正确的。 但是,只有在一个网络应用程序中进行重写时,这只能起作用。如果我删除上述规则并添加一个简单的规则(和相应的出站规则)来重写例如。 / x / WHATEVER到just / WHATEVER,所有这些都完美无缺,而不需要清除HTTP_ACCEPT_ENCODING – 为重写的请求启用规则工作和压缩。 但是,一旦我重新添加我的规则,将响应重写为不同的Web应用程序,并且我不清除HTTP_ACCEPT_ENCODING标题,则会再次出现相同的错误。 从我所理解的,如果重写涉及另一个网络应用程序,则可以做的更多的约束。例如。 URL重写器必须从后端服务器接收未压缩的响应,以便能够使用出站规则进行重写。我想在这种情况下清除HTTP_ACCEPT_ENCODING是必须的,因为这样。 但是,由于压缩模块列在模块列表的顶部,所以最终重写的响应应该被压缩,无论其来源于何处。似乎IIS做了一些快捷方式,并将响应返回给客户端绕过压缩模块。或者HTTP_ACCEPT_ENCODING标头被尽快删除,以完全禁用压缩(不仅在服务器到服务器通信中)。 所以最后我的问题是:有压缩这些回应的方法吗? 解决方法
我自己弄清楚了。
需要做些什么来使其工作: 在将请求路由到后端服务器之前,必须删除Accept-Encoding头,以便可以使用出站规则重写响应 我决定这样做: >将新的服务器变量添加到重写规则,以保持客户端发送的原始头文件: <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" /> (我把它放在清除HTTP_ACCEPT_ENCODING变量的行之前) <rule name="RestoreAcceptEncoding" preCondition="NeedsRestoringAcceptEncoding"> <match serverVariable="HTTP_ACCEPT_ENCODING" pattern="^(.*)" /> <action type="Rewrite" value="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" /> </rule> 和附带的前提条件: <preCondition name="NeedsRestoringAcceptEncoding"> <add input="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" pattern=".+" /> </preCondition> 到目前为止,就像魅力一样。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – Angular.js和WebAPI CRUD示例
- asp.net – DataBinding Eval到2个小数位置不显示0
- asp.net-mvc – 最新的ASP.Net MVC 3请求处理管道图?
- asp.net – 避免Web应用程序的会话劫持
- asp.net – ‘ToArray’不是’String’的成员
- asp.net-mvc-3 – 在剃刀视图中使用泛型方法
- 多个控制器,一个视图和一个模型ASP.NET MVC 3
- asp.net – Orchard CMS和Sitefinity CMS
- asp.net – 在文件夹及其子文件夹上创建缓存依赖性
- asp.net-mvc-3 – Asp.net MVC3从razor View访问内部类
- asp.net – 将Dictionary加入querystring的最快方
- 为什么MVC而不是好的旧ASP.NET?还没有抓住为什么
- asp.net – Glass Mapper打破了图像字段的标准值
- Scaffolding Template on Asp.Net Core Ra
- asp.net-mvc – 如何将可视化设计器集成到开发过
- asp.net – 根据角色为某些用户提供更强的密码
- asp.net-mvc – 我应该在LogOff方法中使用Sessio
- 禁用ASP.Net ReportViewer控件上的分页
- asp.net-mvc – 我需要在我的所有页面上使用`[Va
- asp.net-mvc – Azure下载blob文件流/ memorystr