如何在 IIS 中為一般錯誤頁面發送狀態程式碼“500”?
我正在使用使用 ASP.NET
<customErrors>指令的通用錯誤頁面。<customErrors mode="On" defaultRedirect="500.html" redirectMode="ResponseRewrite"> </customErrors>問題 - 發生錯誤時,此頁面不返回 HTTP 狀態“500”。它是 200。所以連結檢查器和蜘蛛程序看不到有任何問題。
如何將 500 HTTP 狀態與靜態 500.html 頁面一起發送?
要求:
- 我必須使用 redirectMode=“ResponseRewrite”
- 我不能使用動態頁面,只能使用靜態 .html。
customErrors 元素的 MSDN 文件聲明它由 System.Web.Configuration.CustomErrorsSection 實現。如果我們使用 Red Gate 的 .NET Reflector 來分析該類,我們可以看到該設置在框架中的使用位置。
它由 System.Web.UI.Page.HandleError 和 System.Web.HttpResponse.ReportRuntimeError 使用。
這兩個最終都呼叫 System.Web.HttpResponse.RedirectToErrorPage。(此方法的名稱令人困惑:重要的是要注意 RedirectToErrorPage 將 redirectMode 設置作為參數,因此即使您使用的是 ResponseRewrite 並且實際上沒有發生重定向,它也會被呼叫。)
RedirectToErrorPage 方法的相關部分是:
if (redirectMode == CustomErrorsRedirectMode.ResponseRewrite) { this.Context.Server.Execute(url); }似乎沒有任何方法可以在錯誤處理中設置響應程式碼:歸根結底,它只是一個普通的 Server.Execute。因此,您似乎不可避免地需要編寫程式碼來實現所需的 HTTP 響應。
你能重新檢查一下為什麼要使用普通的 .html 文件嗎?這似乎是錯誤處理的明智選擇,因為您不希望在可能導致發生另一個錯誤時經歷 .aspx 頁面的所有成本。
但也許有一些中間立場會像 .html 文件一樣健壯?
例如,您可以製作一個預編譯的 HttpHandler,將其註冊到 URL /500.error,然後將 500.error 設為您的預設重定向頁面。(這類似於 ScriptResource.axd 的工作方式。)如果您將模組預編譯為 DLL(而不是從普通的舊 .axd 文件進行動態編譯),您可能會發現它在面對錯誤情況。如果您遇到一個錯誤,甚至這都不起作用,那麼靜態 .html 文件可能也不起作用——請記住,customErrors 指令仍然依賴於在後台執行的 .NET,並且仍然使用 StaticFileHandler 來提供服務你的 .html 文件。
或者,您可以考慮在 IIS 應用程序前面使用反向代理,即使面對應用程序池的災難性故障,它也可以提供友好的 500 頁。這將需要更多的工作來設置,但會比 customErrors 更健壯,例如,如果您的 web.config 損壞,即使 customErrors 也不起作用。