重写<action url =“..”>如何在缺少文件时显示自定义404页面?

时间:2017-08-25 07:59:27

标签: asp.net url-rewriting custom-error-pages

我正在处理的网站(IIS8上的.Net 4.0和VS2010)使用单个规则将所有传入的网址重写为单个&#34;中存在的.aspx网页。 /页/&#34;夹。例如,&#34; www.site.com/hello"被重写为&#34; /pages/hello.aspx"。

目前的重写规则是:

    <rule name="pages" patternSyntax="ECMAScript" stopProcessing="true">
      <match url="^([a-z0-9_-]+(?:/[a-z0-9_-]+)*)/?$"/>
      <action type="Rewrite" url="/pages/{R:1}.aspx" appendQueryString="true" />
    </rule>

这很好用,但是当我满足以下任一条件时,我很难实现自定义404重定向:

a)正则表达式中定义的url格式不匹配(即未遵守严格的url格式),或

b)匹配url正则表达式,但是对url="/pages/{R:1}.aspx"的重写不存在(例如,url是&#34; / pages&#34;但是物理文件&#34; / pages / hello。 aspx&#34;不存在)。

这可以用重写规则来完成吗?

1 个答案:

答案 0 :(得分:0)

发现stopProcessing="false"的目的。 :)

可以在下一个规则中进一步测试重写的URL,如果它最终没有指向现有文件,则重定向到404页面。工作代码是:

<rule name="pages" patternSyntax="ECMAScript" stopProcessing="false">
  <match url="^([a-z0-9_-]+(?:/[a-z0-9_-]+)*)/?$"/>
  <action type="Rewrite" url="/pages/{R:1}.aspx" appendQueryString="true" />
</rule>
<rule name="404" patternSyntax="ECMAScript" stopProcessing="true">
  <match url="(.*)" />
  <conditions>
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
  </conditions>
  <action type="Rewrite" url="pages/Error404.aspx" />
</rule>