ASP.NET MVC应用程序中web.config文件的customErrors
和httpErrors
部分之间有什么区别?
使用每个部分有哪些指导原则?
答案 0 :(得分:120)
* 2016年4月更新
当.net代码抛出异常(404,403,500等)时使用customErrors属性,并且当IIS本身抛出异常时使用httpErrors属性。
尝试正确配置这一点有很多陷阱。因此,如果您正在寻找一个快速示例,您拥有的最佳选择是:
示例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部分使用扩展名较少的网址不可能!。(没有黑客攻击)
一种解决方法是禁用自定义错误并让http错误处理自定义页面。朋友创建了这样的设置,当我找到一些时间时,我将分享代码。
<强>背景强>
一个好的自定义错误页面将:
所以要澄清我们配置中的一些选项:
<customErrors mode="RemoteOnly"
。您可以在此处指定:On
,Off
,RemoteOnly
。
On
=始终显示自定义错误页面Off
=始终显示真实错误RemoteOnly
=在本地显示错误,但远程显示自定义错误页面。
所以我们希望{1}用于声明1 RemoteOnly
。您可以在此处指定:<customErrors redirectMode="ResponseRewrite"
或ResponseRedirect
。 ResponseRewrite
模式会将错误页面重定向到自定义错误页面。对于链接爬虫(SEO),这将导致302 - &gt; 500,但您希望链接爬虫获得500错误。
ResponseRedirect
。这相当于<httpErrors errorMode="DetailedLocalOnly"
模式。您拥有的选项:customErrors
,Custom
,Detailed
。
一篇很有帮助我的博客文章是:http://benfoster.io/blog/aspnet-mvc-custom-error-pages
答案 1 :(得分:79)
免责声明:这是根据我的经验而未经证明的事实。
两者都用于定义网站的错误处理,但不同的软件指的是不同的配置元素。
customErrors
是一个遗留的(可向后兼容的)元素,由Visual Studio Development Server(又名VSDS或Cassini)使用。
httpErrors
是仅由IIS7使用的新元素。
这会在使用VSDS而不是本地IIS开发ASP.NET网站时突出显示可能的问题。
另外,refer to this post by myself关于如何使用IIS7处理错误消息,如果您希望完全控制错误输出。
VSDS
中开发 - 使用customErrors
IIS6
- 使用customErrors
IIS7
- 使用httpErrors
。如果您使用VSDS
进行开发,但发布到IIS7
,那么我猜您需要两者。
答案 2 :(得分:33)
<customErrors>
与<httpErrors>
<customErrors>
<httpErrors>
注意:不再需要使用
customErrors
引用来源:Custom 404 and error pages in ASP.NET(优秀文章)
ExecuteURL
提供动态内容,例如.aspx页面(path
值必须是服务器相对网址):
<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 Errors (www.iis.net)
了解更多详情,请阅读上面的www.iis.net链接
答案 3 :(得分:4)
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错误处理检查链接的示例: