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

时间:2014-08-30 04:34:18

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

我尝试设置IIS URL重写规则以匹配403响应,因为有人在禁用目录浏览时尝试浏览目录。我想将它们重定向到我为404s定义的常用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响应中也不会存在。

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

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

4 个答案:

答案 0 :(得分:10)

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

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

这是一个执行这两个功能的示例配置。

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

经过测试,您可以关闭errorMode =&#34; Custom&#34;。

答案 1 :(得分:4)

不确定这是否有帮助,因为它不是重写规则,但这将使用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>

答案 2 :(得分:1)

我记得在我们遇到这个问题的时候,我们进入了域名注册机构,并将DNS记录转发给我们(我认为它们是CNAME记录)。这是一个混乱,保持一切同步,但这是我们能够让它工作的唯一方式。 IIS中的HTTP和URL重写在某些情况下至少不适用于SharePoint。

答案 3 :(得分:0)

我也没有多少运气 - 但我怀疑这个回应中可能有一个暗示

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

引用他们的回复:“然而,在503个案例中,请求永远不会进入工作进程,503回复直接来自http.sys。”

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