在這個廣域網中,我們所有人都一定會看到3個Logo:測試你網速的藍色熊掌,令你絕望的加載圓圈,還有“褲子都脫了就給我看這個?”的404頁面。前兩個好歹還能讓你看點東西,而最后一個則是最糟糕的用戶體驗——除了告訴你打不開網頁就似乎真的什么也沒有了,不知道各位有沒有想過這個404是怎么產生的,除了404還有什么?今天我們就來談一談那些狀態碼。
404和HTTP狀態碼
上面所說的404其實是一種標準的HTTP返回代碼,官方名稱是HTTP狀態碼(HTTP Status Code),用于表示網頁服務器HTTP的響應狀態。但似乎一般人都不會仔細研究這些HTTP狀態碼和這些狀態碼對開發人員的影響。也許,一個開發人員就算不知道這些狀態碼也能開發出一個網站,但如果企業要開發一個大型網站,在某些時候需要微調或系統整合需要到更底層的網絡工作時,就有可能遇到瓶頸,特別是在出錯時更加明顯。對于狀態碼的分類有三個層級,就好像404那樣用3三個數字表示,分為大類,中類和小類。值得一提的是,在IIS(Internet信息服務)中還有不少微軟制定的擴充狀態碼,格式類似404.1這樣,能更深層次的讓開發者清楚出錯原因。
在進行請求的時候,我們看到的都只是服務器最后返回來的狀態碼,比如出錯的404和成功的200,但是實際上在請求的過程中,會有很多的狀態碼在快速變化,除非是類似打斷點的操作,一步操作停一下,否則是不能看出這些狀態碼是怎么變化的,這就導致在服務器響應過程中有很多狀態碼我們都看不到。
審查元素可以看到各個請求最終的狀態碼
首先,我們要知道幾乎所有的HTTP狀態碼都被分成了五大類:
1開頭的表示服務器收到請求并需要請求這繼續處理;
2開頭的成功響應,表示成功處理了請求;
3開頭的重定向,引導瀏覽器跳轉到另一個資源頁面;
4開頭表示請求出錯,妨礙了服務器的處理,服務器會返回一個狀態碼解釋到底是什么錯誤;
5開頭的表示服務器錯誤,并不是請求者的原因;
就拿404舉個例子,作為最出名的狀態碼,我們想來詳細解釋下404這三個數字的含義:第一個4表示客戶端出錯,第二個0表示請求者把網址打錯了,最后的4表示4開頭的錯誤狀態碼中排第四。
那么404是怎么產生的呢?當用戶在地址欄輸入一個網址后,這時候IIS首先會檢測用戶輸入的地址是否有對應的網頁信息,如果沒有,IIS就會通過服務器想用戶返回404錯誤狀態碼提示,告訴用戶找不到地址對應的網頁信息,但服務器并不清楚這種情況是暫時性的還是永久性的。出現404最多的原因就是用戶輸入了錯誤的鏈接,或者無法響應并找不到原因,也有可能就是網頁被刪除了。
為什么要設計404頁面
以4xx開頭的錯誤都是跟“客戶端”有關,比如用戶可能訪問了不存在的頁面,用戶權限不足或者未提供有效的驗證信息(輸入錯誤的賬號密碼等)。盡管404頁面被用戶瀏覽到的概率相對于全站的其他頁面來說要小得多,但頁面難免會出錯,無論是用戶的誤操作還是服務器的原因,作為網站開發者也無法控制錯誤頁面的出現,但開發者可以通過設計一個特別的404錯誤頁面將用戶失望度降到最低,開發者需要在這個頁面很好的把信息傳達給用戶,并引導用戶進行下一步的操作。
訪問到錯誤頁面是不愉快的用戶體驗,作為開發者可以提供一些應對方法
還有什么比較出名的狀態碼?
其實除了404 Not Found外,還有很多HTTP狀態碼,這些狀態碼都有自己的含義,所以我們說說一些比較常見的狀態碼以及它們的表達信息。
400錯誤請求:400代表語義有誤,服務器無法理解用戶的請求,除非進行修改,不然沒必要一邊按F5一邊噴服務器垃圾。比如說別把www.baidu.com.打成com.baidu.www.,否則服務器是不知道你在說什么鳥語。在減少這類錯誤的道路上,偉大的人類發明了搜索引擎,容錯率隨之提高。
401未授權:一般來說該錯誤消息表明你首先需要登錄(輸入有效的用戶名和密碼)。如果你不輸入這些信息,就會有401錯誤,這意味著驗證信息出錯,服務器無法識別你的身份。
403禁止:有句話叫“拉不出屎千萬別怪地球沒引力”,因為出現403是因為服務器拒絕了你的地址請求,或者你根本沒權限訪問網站,提供身份驗證也沒用,也就是說,用戶被禁止訪問了。然而除非與Web服務器管理員聯系,否則一旦遇到403狀態碼都無法自行解決。
408請求超時:遇到408意味著你的請求發送到該網站花的時間比該網站的服務器準備等待的時間要長,即鏈接超時。408錯誤往往難以解決,通常涉及系統工作量或系統操作中的一次性變化。如果用戶持續看到408錯誤,管理員首先要考慮到Web服務器的工作量,特別是在產生408錯誤的時間段,另外網絡流量激增也可能導致用戶無法訪問網頁從而出現該錯誤。
梯子不夠長,墻外的世界不是你想看就能看的
410永久刪除:如果用戶訪問的網頁被永久刪除,服務器就會返回410代碼。410實際上和404有點相似,在服務器不確定這個情況是不是永久的情況下,應該使用404狀態碼。410響應的目的主要是幫助網站管理員維護網站,通知用戶這個網頁資源已經不能再使用,并且服務器擁有者希望所有指向這個資源的遠端鏈接也被刪除。不過之后的事,就涉及到301和302返回碼了。
301永久移動,302臨時移動:在優化網站的時候,301重定向是網站管理員必用的,在網頁被移動后多數情況下瀏覽器會自動定向到新的URI(統一資源標識符),并且以后任何新的請求都應使用新的URI來代替。而302只是URI被理解為臨時交換而已,客戶端還是會繼續使用原來的地址發送請求。這兩種現象出現在網頁的域名更換后,搜索引擎還使用原有域名地址訪問URI,如果搜索引擎得到301返回碼,那么搜索引擎就知道管理員更換了域名,下次就會自動用新域名來索引網站。
305使用代理:訪問者只能使用代理來訪問網頁,如果服務器放回這個狀態碼,意思是你需要一張梯子。想要登陸諸如Google,Youtube,Facebook這些不存在的網站,除了使用VPN別無辦法。
509超過帶寬限制:相比其他500狀態碼,509算是一個特殊的存在。之所以特殊,是因為這個錯誤要用錢來解決。509并不是官方的狀態碼,但是仍然被廣泛使用。正如名字所示,網站流量增大,帶寬不夠用就會出現這類錯誤,網站管理員只能掏錢向主機商買流量。
除了上述所說的一部分HTTP狀態碼外,還有很多其他的狀態碼,比如100,200等,這些狀態碼都有自己的信息定義和作用,限于篇幅原因只能列舉一些很常見的狀態碼。HTTP狀態碼通常都與用戶的瀏覽體驗息息相關,它能告訴客戶端當前發生了什么事,或者說當前Web服務器的響應狀態。作為開發者有必要了解這些狀態碼,能夠明白問題出在哪,從而針對性地解決問題。