无法使用 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 响应代码的主要内容,如果未能解决你的问题,请参考以下文章