我正在实现一个反向代理,用于将请求路由到后端服务器。
在功能上一切正常,但是我担心所有来自后端服务器的响应都在没有压缩的情况下传输到客户端(web浏览器)。
设置如下:
内部域上公共不可访问的
https://internal.app
https://site.com
.。
我希望以一种对客户端透明的方式将所有对https://site.com/app/WHATEVER
的请求路由到https://internal.app/WHATEVER
。
我当前的设置基于URL重写2.0和应用程序请求路由IIS扩展。一般方法基于以下文章中的指导方针:
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, 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").
我知道this thread,并且我已经遵循了这些说明。我已经设置了dynamicCompressionBeforeCache="false"
,正如上面所看到的,我已经添加了必要的注册表项,并且我已经确保模块在IIS中的顺序是正确的。
然而,这似乎只有当重写发生在一个web应用程序中时才有效。如果我删除上面的规则并添加一个简单的规则(以及相应的出站规则)来重写,例如/x/WHATEVER
重写为/WHATEVER
,则无需清除HTTP_ACCEPT_ENCODING
,所有规则都可以正常工作-规则可以工作,重写的请求可以压缩。
但是一旦我重新添加了我的规则,该规则将响应重写到不同的web应用程序,并且我没有清除HTTP_ACCEPT_ENCODING
标头,同样的错误再次出现。
据我所知,如果重写涉及另一个web应用程序,那么可以做的事情就会有更多的限制。例如,URL重写器必须从后端服务器接收未压缩的响应,以便能够使用出站规则重写它。我想在这个场景中清除HTTP_ACCEPT_ENCODING
是必须的。
但是,我希望由于压缩模块列在模块列表的顶部,所以无论来自何处,最终重写的响应都应该被压缩。IIS似乎做了一些捷径,并绕过压缩模块将响应返回给客户端。或者足够快地移除HTTP_ACCEPT_ENCODING
报头以完全禁用压缩(不仅在服务器到服务器通信中)。
所以最后,我的问题是:有没有一种方法来压缩这些响应?
https://stackoverflow.com/questions/15926203
复制相似问题