:派大星
:幹嘛
:我想到比24還要好笑的笑話
:說來聽聽
:500
好的,我知道很多工程師看到這種頁面都笑不出來。在處理和 HTTP Request 有關的東西總是逃不出和 HTTP status code 打交道,這些神秘數字不懂的人一頭霧水,懂數字的人,數字就會幫助你。
HTTP status code 的中文叫做 HTTP 狀態碼,但有些詞真的比較少人講中文,通常我們就會直接說 Status code。 Status code 代表的是一次 HTTP 的請求發出後,用戶端要求瀏覽網頁資源,網頁(Server)端會回傳對應狀態碼來表示這次請求的狀況,基本為三位數字。
HTTP status code 可以分為五大類:
在 IIS 中,前面的截圖裡大家應該常看到內部錯誤頁面會顯示 HttpStatusCode.SubStatusCode 這樣的組合,我也多次提到 Sub status code這個詞。Sub status code 是 IIS 專門使用來進一步列出各種情況的詳細代碼,官方是有文件可以查詢的。
HTTP status code overview 一文裡就詳細的介紹了 IIS 中所有基本模組可能遇到的所有 Status code 組合,在你有了 Status code 後來找這篇文章,基本你能拿到一定資訊。獲取 Status code 在沒有開啟 Detail Error Page 的狀況下,就得從 IIS Log 來翻找,後面會提到。
如我上面的截圖的錯誤是 500.19,對照文件的錯誤描述是 Configuration data is invalid,設置文件有誤,該錯誤是我刻意改掉了一個角括號造成的。像透過這種方式,就能夠更貼近一些問題狀況。
400 和 500 兩種代表錯誤的 Status code 情況不一定單純,有可能是複合問題造成的錯誤,官方針對 400 / 500 兩種狀態碼都有提供對應的 Trouble Shooting Guide。
HTTP 400 error responses to HTTP requests
儘管可能寫的比較通用,有些思路還是能參考,畢竟有問題的時候多一個能參考的可能性也是很必要的。
這裡借一張官方的圖(from How to Use HTTP Detailed Errors in IIS 7.0)來描述一下 HTTP status code 模組的設定邏輯:
httpError Module 收到 RQ_SEND_RESPONSE 事件後觸發處理流程,首先判斷狀態碼是否大於 400,大於等於才是錯誤,小於則直接返回。接下來判斷是否要顯示客製化的錯誤頁面,會根據你在 Error Pages 模組裡設定的來判斷當前是否要顯示細節,如需顯示細節,會需要更進一步的判斷,如 ASP.NET 可能會吐一些 call stack;如果是要顯示客制頁面,會去尋找設定檔中是否有針對該錯誤做錯誤頁面設定,有的話顯示對應位址,沒有則顯示單行的錯誤碼訊息(系統預設的 htm 檔案)。
關於 Http status code 的基本大概上面這些就足夠了,實際問題發生往往需要更深入的察看才能知道真的有問題的地方。也別忘了做好錯誤碼的客製頁面處理,儘管錯誤內容對除錯和修復網站來說很重要,但意外地暴露過多錯誤訊息,可會讓有心人抓到網站的漏洞。