設置404錯誤頁的意義我就不說了。主要想記錄一下這次設置錯誤頁遇到的問題和解決方法。
第一版:本地測試能跳轉到自定義的404頁面,上線之后卻沒能跳轉。
因為之前的項目有跳轉404頁面的例子,所以直接拷貝了一份到現在的項目,代碼如下:
HomeController
public ActionResult Index() { Response.StatusCode = 404; Response.Charset = "utf-8"; return View("404"); }
Web.config
<customErrors defaultRedirect = "home/error" mode="On"> <error statusCode="404" redirect="/home/error"/> </customErrors>
按照上面的代碼書寫,本地測試跳轉到了自定義的404頁,上線之后卻是默認的404頁。就這樣,第一個版本失敗了。
第二版:上線之后可以正常跳轉至404頁面,狀態碼卻返回302。
開發中"本地環境可以,生產環境卻不行"的情況屢見不鮮。后來干脆在阿里雲租了一台服務器,這里有個小插曲,我發布了一個測試版本不能正常運行,
原因是這個"HTTP 錯誤 404.0 - Not-Found"。
測試版本跑通之后,發現線上沒有跳轉自定義404頁的原因是沒有設置IIS。設置步驟如下圖:
1.找到IIS的404錯誤頁選項(IIS里還有ASP.NET的.NET錯誤頁,這里最好選IIS的錯誤頁,下面有寫原因)
2.打開錯誤頁后,編輯自定義錯誤頁,這里以相當路徑設置錯誤頁url(IIS的版本不一樣,編輯自定義錯誤頁的窗口也不一樣)
設置OK之后,本以為大功告成,卻發現根本錯誤,返回狀態碼是302,"Response.StatusCode = 404"也沒強擼過來。
至此,第二個版本還是失敗了。
第三版:利用httpErrors設置網站404頁跳轉(正確版本)
之后了解到customErrors會以302重定向跳轉至自定義錯誤頁,雖然跳轉到了自定義錯誤頁,但狀態碼卻不對,並且url都會帶參數aspxerrorpath。
httpErrors只需要配置一下Web.config即可,配置好之后會自動映射到IIS:
Web.config
<httpErrors errorMode="Custom" existingResponse="Replace"> <clear /> <error statusCode="404" path="Error\404.html" /> <error statusCode="500" path="Error\500.html" /> </httpErrors>
映射之后的IIS
到這自定義404頁才算設置正確,用戶請求的錯誤的url會跳轉至自定義404頁,狀態碼返回404,並且保持原url。
分析:ASP.NET下的.NET錯誤頁和IIS下的錯誤頁有什么區別?
在Web.config中,分別配置<customErrors>和<httpErrors>節點即可完成兩者錯誤頁的設置。主要有以下不同點:
1.從定義上,<customErrors>設置ASP.NET應用程序的錯誤;<httpErrors>是IIS7.0新增的特性,設置IIS對http請求的錯誤處理;
2.Visual Studio提供了一個脫離IIS但能執行ASP.NET的環境。想必<customErrors>就是為其准備的;
3.<httpErrors>優先級要高於<customErrors>。這也是"在本地可以,一上線就不行了"的一個原因。