我采取将请求路由到后端服务器的反向代理。
功能一切正常,但我关注的是从后端服务器的所有响应传输到客户端(网页浏览器)无压缩。
设置如下:
- 后端服务器,供公众无法访问,在内部域。 主机上的Web应用程序
https://internal.app
- 与IIS 7.5前端WEB服务器,托管主要的公共网站,充当后台服务器的代理。 主要站点是在
https://site.com
。
我要路由所有请求https://site.com/app/WHATEVER
到https://internal.app/WHATEVER
的方式是透明的客户。
我目前的设置是基于URL重写2.0和应用程序请求路由IIS扩展。 一般的处理方法是基于下列条款准则:
- 设置使用IIS,URL重写和ARR反向代理
- 反向代理与网址重写v2和应用程序请求路由
有关节web.config
中的site.com
应用:
<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, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, 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 Error 500.52 - URL Rewrite Module Error. Outbound rewrite rules cannot be applied when the content of the HTTP response is encoded ("gzip").
HTTP Error 500.52 - URL Rewrite Module Error. Outbound rewrite rules cannot be applied when the content of the HTTP response is encoded ("gzip").
我知道这个线程和我按照这些指令。 我已经设置dynamicCompressionBeforeCache="false"
如上面可以看出,我已经添加了必要的注册表项,我已经放心,模块是在IIS中正确的顺序。
然而,这似乎只仅当重写一个Web应用程序中发生的工作。 如果删除上述规则,并添加一个简单的(以及相应的出站规则)重写如/x/WHATEVER
刚刚/WHATEVER
,所有的作品完美,而不需要清除HTTP_ACCEPT_ENCODING
-规则运作,并压缩了重写请求启用。
但只要我重新添加我的规则,改写为不同的网络应用程序的响应,我不清除HTTP_ACCEPT_ENCODING
头,再次出现同样的错误。
据我了解,如果重写涉及到另一个Web应用程序,有什么可以做更多的约束。 例如,URL重写必须接收来自后端服务器,以未压缩的响应能够使用出站规则重写一遍。 我想清除HTTP_ACCEPT_ENCODING
在这种情况下是因为这是必须的。
但是,我希望的是,由于压缩模块的模块列表的顶部列出,最后重写反应,应压缩不管它源于。 看来IIS使一些快捷键和返回给客户端绕过压缩模块的响应。 或者HTTP_ACCEPT_ENCODING
移出头部很快完全禁用压缩(不仅在服务器到服务器的通信)。
所以最后,我的问题是:有没有办法来压缩这些反应?