customErrors
- Asp.Net級別的錯誤處理程序,只處理Asp.Net應用拋出的異常(404,403,500。。)
- 在IIS7+的服務器依然可用(IIS7之前就引進了)
- 靜態文件(如.jpg,.htm,.js等)不會被處理
httpErrors
- IIS級別的錯誤信息處理程序,IIS根據請求指定錯誤頁面
- 自IIS7引進
- 處理包括ASP.NET應用及ASP.NET之外的應用(ASP.NET能管的 它會管,ASP.NET不能管得它也管)
- 所有的文件和URL都處理
從對比中能看出 在IIS7之后 就沒必要再用customErrors了,一切httpErrors都可以辦了。
<httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="403" subStatusCode="-1" /> <remove statusCode="404" subStatusCode="-1" /> <error statusCode="403" prefixLanguageFilePath="" path="/403.png" responseMode="ExecuteURL" /> <error statusCode="404" path="/404.aspx" responseMode="ExecuteURL" /> </httpErrors>
其實還可以用一個clear標簽代替多個remove。如下
<httpErrors errorMode="Custom" existingResponse="Replace"> <clear /> <error statusCode="403" prefixLanguageFilePath="" path="/403.png" responseMode="ExecuteURL" /> <error statusCode="404" path="/404.aspx" responseMode="ExecuteURL" /> </httpErrors>
Note:ExecuteURL 只能用於同一個應用下的ASP.NET文件,如果想要重定向到另一個應用,或者一個完全不一樣的完整的URL,我們需要將responseMode設為Redirect。
<httpErrors errorMode="Custom" existingResponse="Replace"> <clear /> <error statusCode="404" path="http://www.bing.com" responseMode="Redirect"/> </httpErrors>
現在通過不同的URL來看兩者的區別
給Web應用定義如下配置
<system.web> <customErrors mode="On" defaultRedirect="Error.html"> <error statusCode="403" redirect="/Error403" /> <error statusCode="404" redirect="/Error404" /> <error statusCode="500" redirect="/Error500" /> </customErrors> </system.web> <system.webServer> <httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL" > <remove statusCode="403"/> <remove statusCode="404"/> <remove statusCode="500"/> <error statusCode="403" responseMode="ExecuteURL" path="/Error403" /> <error statusCode="404" responseMode="ExecuteURL" path="/Error404" /> <error statusCode="500" responseMode="ExecuteURL" path="/Error500" /> </httpErrors> </system.webServer>
現在如果嘗試訪問以下鏈接,將會產生對應的錯誤
URL | Error | StatusCode |
/aaaaaa | httpErrors | 404 |
/aaaaaa.aspx | customErrors | 404 |
/aaaaaa.jpg | httpErrors | 404 |
/throw500.apx | customErrors | 500 |
/throw500 | customErrors | 500 |
注:
- 一般情況 customErrors標簽上的model屬性設為RemoteOnly,httpErrors上的errorModel設為DetailedLocalOnly
- 如果你將某個頁面的StatusCode設為500,不要忘了設置如下屬性
context.Response.TrySkipIisCustomErrors = true;
以下是微軟官網說明:
https://msdn.microsoft.com/zh-cn/library/system.web.httpresponse.tryskipiiscustomerrors.aspx
TrySkipIisCustomErrors 屬性僅在您的應用程序承載在 IIS 7.0 中使用。 在 IIS 7.0 中的經典模式下運行時 TrySkipIisCustomErrors
屬性的默認值是 true。 在集成模式下,運行時 TrySkipIisCustomErrors 屬性的默認值是 false。
補充
errorMode有三個值,分別為Custom、DetailedLocalOnly、Detailed,意思為對用戶與服務器端始終顯示自定義頁面、只能服務器端顯示詳細出錯信息、對用戶與服務器端始終顯示詳細出錯信息。
responseMode有File、ExecuteUrl、Redirect三個層,分別表示使用服務器端靜態文件、可執行的URL、URL轉向。
注意:<httpErrors>與<customErrors>是不同的,前者主要用於處理http相關的錯誤信息,而后者主要是處理應用程序級的錯誤頁轉向。
<!-- 自定義錯誤信息
設置 customErrors mode="On" 或 "RemoteOnly" 以啟用自定義錯誤信息,或設置為 "Off" 以禁用自定義錯誤信息。
為每個要處理的錯誤添加 <error> 標記。
"On" 始終顯示自定義(友好的)信息。
"Off" 始終顯示詳細的 ASP.NET 錯誤信息。
"RemoteOnly" 只對不在本地 Web 服務器上運行的
用戶顯示自定義(友好的)信息。出於安全目的,建議使用此設置,以便
不向遠程客戶端顯示應用程序的詳細信息。
-->