我一直尝试在 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
当 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!