无法使用 URL 重写出站规则更改 IIS 响应代码

Posted

技术标签:

【中文标题】无法使用 URL 重写出站规则更改 IIS 响应代码【英文标题】:Can't change IIS response code with URL Rewrite outbound rule 【发布时间】:2014-10-24 02:25:53 【问题描述】:

我正在尝试设置一个 IIS URL 重写规则来匹配 403 响应,因为在禁用目录浏览时有人试图浏览到一个目录。然后我想将它们重定向到我为 404 定义的常用 ASP.NET 自定义错误页面。

这是我目前拥有的:

<outboundRules>
  <!-- By default, browsing a directory with no default resource will return 403 -->
  <rule name="Directory browsing location">
    <match serverVariable="RESPONSE_LOCATION" pattern="(.*)" />
    <conditions>
      <add input="RESPONSE_STATUS" pattern="^403" />
    </conditions>
    <action type="Rewrite" value="/Error/PageNotFound?aspxerrorpath=PATH_INFO"/>
  </rule>
  <rule name="Directory browsing status code" patternSyntax="ExactMatch">
    <match serverVariable="RESPONSE_STATUS" pattern="403" />
    <action type="Rewrite" value="302" />
  </rule>
</outboundRules>

我的假设是它需要是一个出站规则,并且我需要重写状态代码并添加位置响应标头,尽管原始 403 响应无论如何都不存在后者。

目前的行为是......什么都没有。不管我做了多少调整,我仍然看到 403。有什么想法吗?

顺便说一句,不,网站上没有任何合法的 403 会因此而被吞没。我还可以为每个可能导致满足条件的路径创建入站规则,但这不是很可扩展。

【问题讨论】:

【参考方案1】:

URL 重写几乎可以处理所有内容,但没有 HTTP 状态代码,因为它位于响应标头之外。所以不幸的是,URL Rewrite 对此无能为力,或者至少我无法找到。我多次想做类似的事情。请注意,您可以使用 RESPONSE_STATUS 检查带有条件的状态,但不能更新它。

@RyanCEI 的回复是我的建议。除此之外,您可以使用 subStatusCode 将错误范围限定为 403.14,并且仅用于测试,请确保测试脱机或将 errorMode 设置为自定义,因为默认情况下,IIS 不会显示自定义错误在本地盒子上测试时的页面。

这是一个同时执行这两个操作的示例配置。

    <httpErrors errorMode="Custom">
        <error statusCode="403" subStatusCode="14" path="/errorpage.htm" responseMode="ExecuteURL" />
    </httpErrors>

测试后可以关闭errorMode="Custom"。

【讨论】:

【参考方案2】:

不确定这是否有帮助,因为它不是重写规则,但这将使用 web.config 的 httpErrors 部分强制 403 进入您的错误页面:

<configuration>
    <system.web>
      <compilation debug="false" targetFramework="4.5" />
      <httpRuntime targetFramework="4.5" />
      <customErrors defaultRedirect="~/errorpage.html" mode="On">
      </customErrors>
    </system.web>
  <system.webServer>
    <httpErrors>
      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="404" prefixLanguageFilePath="" path="/errorpage.html" responseMode="ExecuteURL" />
      <remove statusCode="403" subStatusCode="-1" />
      <error statusCode="403" prefixLanguageFilePath="" path="/errorpage.html" responseMode="ExecuteURL" />
    </httpErrors>
    <defaultDocument>
      <files>
        <remove value="default.aspx" />
        <remove value="iisstart.htm" />
        <remove value="index.htm" />
        <remove value="Default.asp" />
        <remove value="Default.htm" />
      </files>
    </defaultDocument>
  </system.webServer>
</configuration>

【讨论】:

【参考方案3】:

我记得当我们遇到这个问题时,我们使用 SharePoint 进入域名注册商获取我们的域名并将 DNS 记录放入转发内容(我认为它们是 CNAME 记录)。保持同步是一团糟,但这是我们让它工作的唯一方法。 IIS 中的 HTTP 和 URL 重写至少在某些情况下不适用于 SharePoint。

【讨论】:

【参考方案4】:

我也没有太多运气 - 但我怀疑这个回复中可能有暗示

http://forums.iis.net/t/1200342.aspx?URL+rewrite+rule+to+capture+response+status+503+and+redirect

引用他们的回复:“但是,在 503 情况下,请求永远不会到达工作进程,并且 503 回复直接来自 http.sys。”

我怀疑 403 可能永远不会进入 IIS 进程并且无法重写。

【讨论】:

以上是关于无法使用 URL 重写出站规则更改 IIS 响应代码的主要内容,如果未能解决你的问题,请参考以下文章

URL重写2.1.mis

如何配置iis rewrite模块的url重写规则

当从HTTPS协议发出请求时,IIS URL重写规则(Pattern)无法识别{HTTP_HOST}

关于IIS7 URL重写的问题

IIS URL 重写规则

thinkphp在iis下如何写规则url重写