【问题标题】:ASP.NET MVC custom error pages stuck in a redirection loopASP.NET MVC 自定义错误页面卡在重定向循环中
【发布时间】:2020-12-23 07:55:08
【问题描述】:

我正在尝试在我的 ASP.NET MVC 应用程序中显示自定义错误页面。 我知道有些错误是由 ASP.NET 处理的,而另一些是由 IIS 处理的。

ASP.NET 的处理和工作正常

<customErrors mode="On" defaultRedirect="~/Error/Index"/>

当我请求一个不存在的 URL 并引用像 .html 这样的静态页面时,我希望 IIS 来处理它。

<httpErrors errorMode="Custom">
      <remove statusCode="404"/>
      <error statusCode="404" path="http://localhost/MySite/404.html" responseMode="Redirect"/>
</httpErrors>

这行得通。但是我不想在那里硬编码 http://localhost 而是让它成为一个相对路径。

所以我尝试了

<httpErrors errorMode="Custom">
    <remove statusCode="404"/>
    <error statusCode="404" path="~/404.html" responseMode="Redirect"/>
</httpErrors>

但是,由于 URL 最终是 http://localhost/MySite/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/404.html,所以它一直在重定向我(它出现了)

如果我这样做也有效

<httpErrors errorMode="Custom">
    <remove statusCode="404"/>
    <error statusCode="404" path="404.html" responseMode="Redirect"/>
</httpErrors>

但当然只有当错误出现在 http://localhost/MySite/doesnotexist.html 根目录中而不是像 http://localhost/MySite/somedir/doesnotexist.html 这样的任何其他目录中时

如果我将 responseMode 更改为任何其他选项,它根本不起作用,显示默认的 IIS 404 页面。

我很疑惑,是什么导致了重定向循环?

【问题讨论】:

  • 是 path="~/404.html" 只是没有得到正确的路径吗?即 Web 应用程序根目录?

标签: asp.net asp.net-mvc redirect iis custom-error-pages


【解决方案1】:

path 属性指定为响应 statusCode 和 subStatusCode 属性指定的 HTTP 错误而提供的文件路径或 URL。如果选择文件响应模式,则指定自定义错误页面的路径。如果您选择 ExecuteURL 响应模式,则路径必须是服务器相对 URL(例如,/404.htm)。如果选择 Redirect 响应模式,则必须输入绝对 URL(例如,www.contoso.com/404.htm)。

responseMode 属性指定如何返回自定义错误内容。 responseMode 属性可以是以下可能值之一。将客户端浏览器重定向到包含自定义错误文件的路径属性中指定的 URL。 如果 responseMode 设置为 Redirect,则路径值必须是绝对 URL。

【讨论】:

  • 谢谢,是的,我阅读了它,就是这样。但是我想知道是否有一种方法可以在不指定应用程序名称/文件夹的情况下输入相对于应用程序根目录而不是服务器根目录的路径
  • 这似乎不可能,需要根据responseMode选择使用哪个路径,responseMode只有三个,并且没有相对于应用根目录的路径。
【解决方案2】:

我已经能够复制您所描述的行为。当我将 responseMode 更改为 file 时,我的问题已修复。 IE。像这样

<httpErrors errorMode="Custom">
  <remove statusCode="404" />
  <error statusCode="404" path="404.html" responseMode="File" />
</httpErrors> 

但问题可能是因为您已将 404.html 放在 mysite 文件夹中。假设它必须留在那里,我认为如果你这样做应该可以工作

<httpErrors errorMode="Custom">
  <remove statusCode="404" />
  <error statusCode="404" path="/mysite/404.html" responseMode="Redirect" />
</httpErrors>   

【讨论】:

  • Mysite 是可以自定义的 IIS 应用程序,因此我也无法对其进行硬编码。但你是对的,它会起作用,就像使用 localhost/MySite/404.html 时一样。当我使用file 时,它根本不接受它,就像根本没有指定任何httpErrors
猜你喜欢
  • 2014-05-06
  • 2014-09-22
  • 1970-01-01
  • 2018-12-03
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 2015-11-14
相关资源
最近更新 更多