customErrors和httpErrors有什么区别?
ASP.NET MVC应用程序中的web.config文件的customErrors
和httpErrors
部分之间有什么区别?
什么是使用每个部分的准则?
免责声明:这是从我的经验,没有certificate的事实。
两者都用于定义网站的error handling,但是不同的软件是指不同的configuration元素。
customErrors
是Visual Studio Development Server(也就是VSDS或Cassini)使用的遗留(向后兼容)元素。
httpErrors
是仅由IIS7使用的新元素。
这突出了在使用VSDS而不是本地IIS开发ASP.NET网站时可能出现的问题。
另外,如果您希望完全控制错误输出,请自行参考此文章,了解如何处理IIS7的错误消息。
概要:
- 在
VSDS
开发 – 使用customErrors
- 发布网站到
IIS6
– 使用customErrors
- 发布网站到
IIS7
– 使用httpErrors
。
如果你用VSDS
开发,但是发布到IIS7
,那么我想你们俩都需要。
* 2016年4月更新
当.net代码抛出一个exception(404,403,500等)时使用customErrors属性,当IIS自身抛出exception时使用httpErrors属性。
- / myfakeextensionslessurl – > httpErrors 404
- /myfakeaspsx.aspx – > customErrors 404
- /myfakeimage.jpg – > httpErrors 404
- /throw500.apx – > customErrors 500
- / throw500 – > customErrors 500
有很多陷阱试图正确configuration。 所以,如果你正在寻找一个快速的例子,你有最好的2个选项是:
示例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部分中使用扩展less的url是不可能的! 。 (没有黑客)
解决办法之一是禁用自定义错误,并让httperror handling自定义页面。 一个朋友创build了这样的设置,当我find一些时候,我会分享代码。
背景
一个好的自定义错误页面将会:
- 在本地访问问题页面时显示真正的exception
- 当您远程访问问题页面时显示自定义页面
- 不会redirect,而只是显示错误页面内容(因为seo的原因)
- 将显示正确的状态码
所以要澄清我们的configuration中的一些选项:
- customErrors mode =“RemoteOnly”。 你可以在这里指定:On,Off,RemoteOnly。 On =始终显示自定义错误页面,Off =始终显示实际错误,RemoteOnly =在本地显示错误,但远程显示自定义错误页面。 所以我们需要RemoteOnly语句1
- customeErrors redirectMode =“ResponseRewrite”。 你可以在这里设置:ResponseRedirect,ResponseRewrite。 模式ResponseRedirect将redirect错误页面到自定义错误页面。 对于链接爬虫(seo),这将导致302 – > 500.虽然你想链接爬虫得到一个简单的500错误。
- httpErrors errorMode =“DetailedLocalOnly”,这是customErrors模式的平等。 您拥有的选项:自定义,详细,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
提供dynamic内容,例如.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链接
在webconfiguration中的错误部分是提供自定义httperror handling方法有两个部分,system.web部分中的一个customErrors和system.webServer部分中的另一个httpErrors(如下所示)
customErrors:在IIS 7引入之前,IIS 6已经使用了这个部分,在根据http状态代码完全使用这个部分来处理自定义http错误之前。
httpErrors:如果请求的页面扩展名与ISAPI dll(.aspx,ashx,.asmx,.svc等)一起注册,比如index.aspx,那么IIS 7和更高版本使用这个部分以及customErrors部分来处理基于它们的文件扩展名的自定义http错误。 IIS从顾客的错误部分拿起设置其他它从httpErrors拿起设置(IIS 7托pipe模式必须设置为集成心情不经典)
下面是404error handling检查链接的例子: