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

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

我正在尝试设置 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>

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

目前的行为……没什么。无论我做了多少调整,我仍然看到 403。有什么想法吗?

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

最佳答案

URL 重写可以处理几乎所有内容,但不能处理 HTTP 状态代码,因为它位于响应 header 之外。不幸的是,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"。

关于asp.net - 无法使用 URL 重写出站规则更改 IIS 响应代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25579048/

相关文章:

asp.net - 闲置一段时间后,Web 应用程序性能下降

php - 跳过某些特定文件的 .htaccess 规则

c# - 根据下拉选择将 ID 保存到数据库

.net - 在 Entity Framework 中包含多个导航属性的语法是什么?

javascript - 为什么 HighChart 在 asp.net 中不可见

iis - 将 IIS 应用程序池回收事件记录在 Windows 事件日志中

asp.net - 从HTTP POST请求有效载荷中检索XML

c# - ASP.NET 5 (ASP.NET Core) - 无法与 IIS 一起运行

php - 在 PHP 中路由 URL

.htaccess - 使用 .htaccess 从 URL 中删除 "/php/"子目录