4

我在将出站规则配置为在 IIS7 上工作时遇到了一些问题,这是让我感到悲伤的场景。我的最终目标是让任何 outboundRules 在几个浏览器中工作。对于此示例,我使用从各种 HTML 标记中去除 .aspx 的规则。

场景 1(内容长度不匹配):

为了让该特定规则在 IIS7 中起作用,我必须默认禁用动态压缩并关闭缓存。我成功地重写了 HTML,但出现了另一个问题,这使得它无法使用。

在尝试使用 outboundrules 重写内容时,我遇到了一个问题,Chrome 和 Firefox 由于标题中的“内容长度不匹配”而执行连续加载(感谢 Fiddler 帮助我识别它)。重写工作,但它会导致内容长度不正确,因此这两个浏览器看起来像是永远加载。尤其是 Chrome,这会导致问题,因为 javascript 似乎已挂起,因此任何 jquery 都无法正常工作,直到有人实际按下停止按钮。

这是我开始使用的 web.config 的相关部分,以便为我提供该场景:

<system.webServer>
  <rewrite>
    <urlCompression doStaticCompression="false" doDynamicCompression="false" dynamicCompressionBeforeCache="false" />
    <modules runAllManagedModulesForAllRequests="true" />
    <outboundRules>
      <rule name="Remove .aspx from links in the response" preCondition="IsHTML" stopProcessing="false">
        <match filterByTags="A, Area, Base, Form, Frame, IFrame, Link, Img, Script" pattern="(.*)\.aspx(\?.*)?$" />
        <action type="Rewrite" value="{R:1}{R:2}" />
      </rule>
      <preConditions>
        <preCondition name="IsHTML">
          <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
        </preCondition>
      </preConditions>
    </outboundRules>
  </rewrite>
  <caching enabled="false" enableKernelCache="false" />
</system.webServer>

在研究这个问题时,我发现了这个stackoverflow 问题,它提到了outboundRules 标记上的rewriteBeforeCache="true"属性以及这篇博客文章,其中列出了我在内容长度问题上遇到的相同问题。

如果我修改该属性,则会导致出站规则无法进一步工作。

场景 2(出站规则不起作用):

因此,由于先前的信息,我开始调整 web.config,并能够通过使用 outboundRules 标记上的 rewriteBeforeCache 属性来解决内容长度不匹配的问题。为了使该属性起作用,我能够重新打开缓存。这修复了场景 1 中的响应长度不匹配,但现在所有 outboundRules\rule 元素似乎都不起作用。我尝试了一些最简单的规则,当我删除 rewriteBeforeCache 属性时它们运行良好,但这会导致场景 1:

<system.webServer>
  <rewrite>
    <urlCompression doStaticCompression="false" doDynamicCompression="true" dynamicCompressionBeforeCache="false" />
    <modules runAllManagedModulesForAllRequests="true" />
    <outboundRules rewriteBeforeCache="true">
      <rule name="Remove .aspx from links in the response" preCondition="IsHTML" stopProcessing="false">
        <match filterByTags="A, Area, Base, Form, Frame, IFrame, Link, Img, Script" pattern="(.*)\.aspx(\?.*)?$" />
        <action type="Rewrite" value="{R:1}{R:2}" />
      </rule>
      <preConditions>
        <preCondition name="IsHTML">
          <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
        </preCondition>
      </preConditions>
    </outboundRules>
  </rewrite>
</system.webServer>

场景 1 导致 IIS7 中的浏览器出现一个错误;方案 2 导致出站规则停止工作。

我已经修改了许多选项,禁用缓存、块模式传输,并尝试了我能想到的每一种组合。

关于 AppPool 的附加说明:IIS7、.NET4.0、经典管道

除了迁移到 IIS7.5 服务器之外,还有其他人对我必须解决的其他选项有什么想法吗?

4

0 回答 0