【问题标题】:Can't change IIS response code with URL Rewrite outbound rule无法使用 URL 重写出站规则更改 IIS 响应代码
【发布时间】: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 会因此而被吞没。我还可以为每个可能导致满足条件的路径创建入站规则,但这不是很可扩展。

【问题讨论】:

    标签: asp.net iis url-rewriting web-config url-rewrite-module


    【解决方案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 进程并且无法重写。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-10-22
            • 1970-01-01
            • 2014-10-27
            • 2011-05-07
            • 2014-05-01
            相关资源
            最近更新 更多