如何使用带有 gzip 压缩的 IIS URL 重写

如何使用带有 gzip 压缩的 IIS URL 重写

我一直尝试在 Windows 2008 R2 上的 IIS 7.5 中为启用了静态 HTML 页面和压缩的站点创建出站规则。

如果我启用任何形式的压缩(静态或动态),我会收到此错误:

HTTP Error 500.52 - URL Rewrite Module Error. Outbound rewrite rules cannot
be applied when the content of the HTTP response is encoded ("gzip").

关闭压缩实际上不是一个选择,因为这会对页面加载性能产生很大的负面影响。

我想任何使用出站重写规则的人都会遇到这个错误,因为您总是希望对文本内容启用压缩。

我看了一些建议来实现这个功能:

https://stackoverflow.com/questions/3713804/url-rewrite-outbound-rules-iis7/4363301#4363301

http://forums.iis.net/p/1165899/1937454.aspx#1937454

但我仍然遇到同样的错误。

有人成功实现了这个功能吗?如果可以,怎么做?

答案1

请参考:https://blogs.msdn.microsoft.com/friis/2016/08/25/iis-with-url-rewrite-as-a-reverse-proxy-part-2-dealing-with-500-52-status-codes/

当 HTTP 响应的内容被编码(“gzip”)时,无法应用出站重写规则。

这是因为来自后端服务器的响应使用了 HTTP 压缩,而 URL 重写无法修改已压缩的响应。这会导致出站规则的处理错误,从而导致 500.52 状态代码。

答案2

如果数据已经被压缩,Rewrite 2.0 就无法修改 HTML 输出。

人们通过重置Accept-Encoding(或将其设置为Accept-Encoding: identity)来禁用压缩:

<serverVariables>
   <set name="HTTP_ACCEPT_ENCODING" value="" />
</serverVariables>

另一种方法是摆脱黑客的 HTML 数据重写:

<outboundRules>
    <rule name="HtmlRspRewriteOutboundRule" preCondition="HtmlRspRewriteCond" enabled="true">
        <match filterByTags="A, Form, Img" pattern="^http(s)?://internal.example.com:8080/(.*)" />
        <action type="Rewrite" value="http{R:1}://app.example.com/{R:2}" />
    </rule>
</outboundRules>

并将其替换为将所有应用程序 URL 绑定到不可移动上下文前缀,就像/app这样所有链接均来自具有给定前缀的服务器根目录您省略了 HTTP/HTTPS 协议、服务器主机名和端口!这样你只需要重写Host响应头:标头未压缩,因此可以避免指定的错误

请记住,HTTP URL 也可以嵌入到 CSS 和 JS 文件中,并且很难正确地重写它们。相对于服务器根目录的 URL

相关内容