非aspx页面的404重定向

13

我正在使用以下web.config代码将请求重定向到缺少页面的404错误处理页面:

<customErrors mode="On" defaultRedirect="404.aspx" redirectMode="ResponseRewrite">
  <error statusCode="404" redirect="404.aspx"/>
</customErrors>

当我查找"missing.aspx"这样的页面时,它能正常工作,但对于没有".aspx"扩展名的页面例如"missing.asp"或"missing"时,它就无法工作了。当它无法工作时,它只会加载标准的IIS 7.5错误页面。

我做错了什么?我正在使用.net 4。我注意到其他人也问了同样的问题,但他们没有得到答案。

谢谢!


尝试移除 redirectMode="ResponseRewrite" - Damith
我尝试使用这个问题中的信息,但无法使其正常工作。您能否看一下https://dev59.com/0F8e5IYBdhLWcg3wZpnw?谢谢。 - JGallardo
这对我有用,我有一个网站项目。https://dev59.com/J2855IYBdhLWcg3wMRRV#48661494 - Ankit Kashyap
3个回答

10

正如dbaseman所说,这是因为非asp.net文件不会调用asp.net处理程序。强制asp.net处理程序对所有请求进行操作的简单方法是在web.config中设置以下内容。

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
</system.webServer>
这会告诉IIS 对所有请求(如.html、.jpg、.css、.js等)运行所有托管模块。一般来说,这样做会被反对,因为它只会增加额外的处理和延迟。有一个更好的选项(比上面的更清晰),可以在这里的答案中找到。另外,也可以参考 这篇文章

我尝试使用你写的内容,但无法使其工作。你介意看一下https://dev59.com/0F8e5IYBdhLWcg3wZpnw吗? - JGallardo
I love you... so much Gary S. - BossWalrus

4
由于非 ASPX 扩展名永远不会传递到 ASP.NET 处理程序,因此您看到的错误来自 IIS。在 web.config 的 system.webServer 下有一个单独的 httpErrors 部分,您需要配置以处理这些错误。有关更多信息,请参见此处
来自链接的示例:
<configuration>
   <system.webServer>
      <httpErrors errorMode="DetailedLocalOnly" defaultResponseMode="File" >
         <remove statusCode="500" />
         <error statusCode="500"
            prefixLanguageFilePath="C:\Contoso\Content\errors"
            path="500.htm" />
       </httpErrors>
   </system.webServer>
</configuration>

我添加了下面的代码,但现在当尝试加载一个不存在的非aspx页面时,它显示页面的源代码而不是运行错误处理页面。 - Osprey
2
这是更好的答案,因为它不依赖于通过ASP.NET管道发送所有请求。@Osprey - 这是因为errorMode被设置为“DetailedLocalOnly”。这个设置表示,嘿,如果请求来自托管文件的机器,请提供一些详细信息,否则显示我定义的500页。这在调试场景中非常有用。您可以将此设置更改为“Custom”,它将始终显示友好的错误消息。 - Tommy
这行不通。为什么在问题明确是关于404错误时,你要加上505? - JGallardo
@JGallardo在本地无法工作,但应该可以在服务器上工作。我假设你可以找到/替换“404”,或者这对你来说太难了? - McGarnagle
@McGarnagle,我显然已经用404替换了它。然后我将其添加到远程服务器上,但仍然无法工作。 - JGallardo

1
将以下内容添加到 Web.config 文件中:

<system.webServer>    
    <httpErrors errorMode="Custom" defaultResponseMode="ExecuteURL" >
      <remove statusCode="404" />
      <error statusCode="404" path="/Default.aspx" responseMode="Redirect" />
    </httpErrors>
  </system.webServer>

我使用了Osprey的代码,并添加了responseMode="Redirect"来解决仅显示页面源代码的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接