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

Tro*_*unt 18 asp.net iis web-config url-rewriting 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>
Run Code Online (Sandbox Code Playgroud)

我的假设是它需要是一个出站规则,我需要重写状态代码并添加位置响应头,尽管后者在最初的403响应中不会存在.

目前的行为是......没有.无论我做多少调整,我仍然会看到403s.有什么想法吗?

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

Sco*_*MVP 10

URL Rewrite几乎可以处理所有内容,但不包含HTTP状态代码,因为它位于响应头之外.所以很遗憾,URL Rewrite对此无能为力,或者至少不是我曾经能找到的.我想多次做类似的事情.请注意,您可以使用{RESPONSE_STATUS}检查条件状态,但无法更新.

@RyanCEI的回复是我推荐的.要添加它,您可以使用subStatusCode将错误范围限定为403.14,并且仅用于测试,请确保要么禁用测试或将errorMode设置为Custom,因为默认情况下IIS不会显示自定义错误在本地方框上测试时的页面.

这是一个示例配置,可以完成这两个任务.

    <httpErrors errorMode="Custom">
        <error statusCode="403" subStatusCode="14" path="/errorpage.htm" responseMode="ExecuteURL" />
    </httpErrors>
Run Code Online (Sandbox Code Playgroud)

测试后,您可以关闭errorMode ="Custom".