customErrors 和 httpErrors 之间有什么区别?
-
21-09-2019 - |
题
两者有什么区别 customErrors
和 httpErrors
ASP.NET MVC 应用程序中 web.config 文件的各个部分?
每个部分的使用指南是什么?
解决方案
免责声明:这是我的经验,未经证实的事实。
两者都用于定义网站的错误处理,但不同的软件引用不同的配置元素。
customErrors
是遗留(向后兼容)元素,由 Visual Studio 开发服务器(又名。VSDS 或卡西尼号)。
httpErrors
是仅由 IIS7 使用的新元素。
这凸显了 可能的 使用 VSDS 而不是本地 IIS 开发 ASP.NET 网站时出现的问题。
还, 自己参考这个帖子 如果您希望完全控制错误输出,请了解如何使用 IIS7 处理错误消息。
概括:
- 发展于
VSDS
- 使用customErrors
- 将网站发布到
IIS6
- 使用customErrors
- 将网站发布到
IIS7
- 使用httpErrors
.
如果你开发 VSDS
但发布到 IIS7
, ,那么我想你两者都需要。
其他提示
*更新于 2016 年 4 月
当 .net 代码引发异常(404、403、500 等)时,将使用 customErrors 属性;当 IIS 本身引发异常时,将使用 httpErrors 属性。
- /myfakeextensionslessurl --> httpErrors 404
- /myfakeaspsx.aspx --> 自定义错误 404
- /myfakeimage.jpg --> httpErrors 404
- /throw500.apx --> 自定义错误 500
- / throw500 --> 自定义错误 500
尝试正确配置它会遇到很多陷阱。因此,如果您正在寻找一个简单的示例,那么最好的两个选择是:
示例1:使用 html 页面
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="/Error500.html" redirectMode="ResponseRewrite">
<error statusCode="403" redirect="/Error403.html" />
<error statusCode="404" redirect="/Error404.html" />
<error statusCode="500" redirect="/Error500.html" />
</customErrors>
</system.web>
<system.webServer>
<httpErrors errorMode="DetailedLocalOnly" existingResponse="Auto">
<remove statusCode="403" />
<remove statusCode="404" />
<remove statusCode="500" />
<error statusCode="403" responseMode="File" path="Error403.html" />
<error statusCode="404" responseMode="File" path="Error404.html" />
<error statusCode="500" responseMode="File" path="Error500.html" />
</httpErrors>
</system.webServer>
示例2:使用 aspx 页面
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="/Error500.html" redirectMode="ResponseRewrite">
<error statusCode="403" redirect="/Error403.aspx" />
<error statusCode="404" redirect="/Error404.aspx" />
<error statusCode="500" redirect="/Error500.aspx" />
</customErrors>
</system.web>
<system.webServer>
<httpErrors errorMode="DetailedLocalOnly" existingResponse="Auto">
<remove statusCode="403" />
<remove statusCode="404" />
<remove statusCode="500" />
<error statusCode="403" responseMode="ExecuteURL" path="Error403.aspx" />
<error statusCode="404" responseMode="ExecuteURL" path="Error404.aspx" />
<error statusCode="500" responseMode="ExecuteURL" path="Error500.aspx" />
</httpErrors>
</system.webServer>
在 aspx 错误页面中,您需要执行以下操作(例如 404 页面):
<%
Response.StatusCode = 404;
Response.TrySkipIisCustomErrors = true;
%>
笔记:在 customErrors 部分使用无扩展名的 url 是 不可能!. (没有黑客)
一种解决方法是禁用自定义错误并让 http 错误处理自定义页面。一个朋友已经创建了这样的设置,当我有时间时,我将分享代码。
背景
一个好的自定义错误页面将:
- 本地访问问题页面时显示真实的异常
- 当您远程访问问题页面时显示自定义页面
- 不会重定向,只是显示错误页面内容(因为seo原因)
- 将显示正确的状态代码
因此,为了澄清我们配置中的一些选项:
<customErrors mode="RemoteOnly"
. 。您可以在此处指定:On
,Off
,RemoteOnly
.On
= 始终显示自定义错误页面Off
= 始终显示真正的错误RemoteOnly
= 在本地显示错误,但在远程显示自定义错误页面。所以我们想要RemoteOnly
对于声明 1
<customErrors redirectMode="ResponseRewrite"
. 。您可以在此处指定:ResponseRedirect
或者ResponseRewrite
. 。这ResponseRedirect
模式会将错误页面重定向到自定义错误页面。对于链接爬虫 (SEO),这将导致 302 -> 500,但您希望链接爬虫获得 500 错误。<httpErrors errorMode="DetailedLocalOnly"
. 。这相当于customErrors
模式。您拥有的选项:Custom
,Detailed
,DetailedLocalOnly
.
一篇对我帮助很大的好博客文章是: http://benfoster.io/blog/aspnet-mvc-custom-error-pages
<customErrors>
相对 <httpErrors>
<customErrors>
- 在 IIS7+ 中仍然可用
- 为 ASP.NET 处理的请求指定自定义错误页面
- 仅处理 ASP.NET 应用程序内的请求
- 不处理静态文件,例如 HTML 文件或目录(“友好”)URL
<httpErrors>
- IIS7中引入
- 为 IIS 处理的请求指定自定义错误页面
- 处理 ASP.NET 应用程序内的请求 和/或 处理 ASP.NET 应用程序外部的请求 *
- 所有文件和 URL 均已处理 *
笔记:不再需要使用
customErrors
引用来源: ASP.NET 中的自定义 404 和错误页面 (优秀文章)
ExecuteURL
提供动态内容,例如 .aspx 页面( path
值必须是 服务器相对 URL):
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL" >
<remove statusCode="404"/>
<error statusCode="404" responseMode="ExecuteURL" path="/error.aspx" />
</httpErrors>
</system.webServer>
File
提供自定义错误文件,例如 .html 页面:
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="File" >
<remove statusCode="404"/>
<error statusCode="404" path="404.html" />
</httpErrors>
</system.webServer>
参考: HTTP 错误 (www.iis.net)
有关更多详细信息,请阅读上面的 www.iis.net 链接
在web配置错误部分是用于提供自定义的HTTP错误处理的方法有两个部分,所述部分的System.Web内部的一个的customErrors和区段system.webServer内的另一个httpErrors(如下面给出的)
<强>的customErrors:强> 这部分是IIS 7之前使用所引入的,IIS 6 5和之前充分利用此部分用于根据HTTP状态代码处理自定义HTTP错误。
<强> httpErrors:强> IIS 7和更高版本使用本节还有的customErrors 部分来处理基于他们的文件扩展名的自定义HTTP错误,如果请求的页面扩展与ISAPI DLL注册(的.aspx,ASHX,的.asmx,.SVC等)像的Index.aspx然后IIS拾取来自的 customeErrors 部分否则它拾取来自设定的 httpErrors 强>(IIS 7托管模式必须被设置成集成心情不经典)
下面是为404的错误处理校验链路的示例: