概述
http 狀態碼是http 協議中服務端返回給客戶度的響應,根據狀態碼得知請求的情況以及服務端的情況。狀態碼分為2xx 3xx 4xx 5xx
3xx介紹
3xx 是重定向相關的狀態碼,通常作為一個中間態。主要有 301 302 303 304 307這幾種。其中301 302 是http1.0 定義的,303 304 307 是http1.1 定義的,注意為了兼容性http1.1 也有301 302 。
303 和307 它們是對HTTP1.0中的302狀態碼的細化,在HTTP1.1中,302理論上是要被放棄掉的,它被細化為303和307,但為了兼容,它目前還在業界中大量使用。
301和302本來在規范中是不允許重定向時改變請求方法的(將POST改為GET),但是許多瀏覽器卻允許重定向時改變請求方法(這是一種不規范的實現)。
303的出現正是為了給上面的301,302這種行為作出個規范(將錯就錯吧),也就是允許重定向時改變請求方法。此外303響應禁止被緩存。大多數的瀏覽器處理302響應時的方式恰恰就是上述規范要求客戶端
處理303響應時應當做的,所以303基本用的很少,一般用302。 307和308的出現也是給上面的行為做個規范,不過是不允許重定向時改變請求方法。
重定向
所謂重定向就是,當瀏覽器向服務端發送url 請求的時候返回狀態碼為30x 時表示請求被重定向了,例如請求時http://www.a.com 返回的請求頭中location:https://www.a.com 那么客戶端就要重新根據location 提供的信息重新發起新的請求。例如在外網的ingress 配置http 強制跳轉https 的時候就是通過配置301強制跳轉的。
301 永久重定向
nginx 配置 rewrite permanent 就是這個效果
302 臨時重定向
HTTP1.1和HTTP1.0的302狀態碼意義是一樣的,瀏覽器對它的處理也是一樣的。POST方法的重定向在未詢問用戶的情況下就變成GET,這種不符合文檔規范的問題依然存在。
303
303狀態碼的響應,也就是現在瀏覽器對302狀態碼的處理:POST重定向為GET
304 Not Modified
該狀態碼表示客戶端發送附帶條件的請求時,服務器端允許請求訪問資源,但是從緩存獲取資源
客戶端在請求一個文件的時候,發現自己有該請求之前的緩存的文件,並且記錄了 Last Modified ,那么在請求頭中會包含 If Modified Since ,這個時間就是緩存文件的 Last Modified 。因此,如果請求中包含 If Modified Since,就說明已經有緩存在客戶端。服務端只要判斷這個時間和當前請求的文件的修改時間就可以確定是返回 304 還是 200 。在服務端的返回的響應頭中通常有Last Modified 如果此值與請求頭中的 If Modified Since時間一致那么返回就是304,否則就是200。 對於靜態文件,例如:CSS、圖片,服務器會自動完成 Last Modified 和 If Modified Since 的比較,完成緩存或者更新。但是對於動態頁面,就是動態產生的頁面,往往沒有包含 Last Modified 信息,這樣瀏覽器、網關等都不會做緩存,也就是在每次請求的時候都完成一個 200 的請求。 因此,對於動態頁面做緩存加速,首先要在 Response 的 HTTP Header 中增加 Last Modified 定義,其次根據 Request 中的 If Modified Since 和被請求內容的更新時間來返回 200 或者 304 。雖然在返回 304 的時候已經做了一次數據庫查詢,但是可以避免接下來更多的數據庫查詢,並且沒有返回頁面內容而只是一個 HTTP Header,從而大大的降低帶寬的消耗,對於用戶的感覺也是提高。 實驗: 請求一個靜態文件網站,第一次返回200 ,F5刷新每次都是304 ,ctrl+F5 強制刷新就會200 發起新的請求而忽略緩存。
307 Temporary Redirect(臨時重定向)
HTTP1.1文檔中307狀態碼則相當於HTTP1.0文檔中的302狀態碼,當客戶端的POST請求收到服務端307狀態碼響應時,需要跟用戶詢問是否應該在新URI上發起POST方法,也就是說 307是不會把POST轉為GET的。
308 永久重定向
請求和所有將來的請求應該使用另一個URI重復。 307和308重復302和301的行為,但不允許HTTP方法更改。
永久(Permanent)和臨時(Temporary)的區別
永久是指原來訪問的資源已經永久刪除啦,客戶端應該根據新的URI訪問重定向。
臨時是指訪問的資源可能暫時先用location的URI訪問,但舊資源還在的,下次你再來訪問的時候可能就不用重定向了。
故301與302的區別:
301表示搜索引擎在抓取新內容的同時也將舊的網址交換為重定向之后的網址;302表示舊地址A的資源還在(仍然可以訪問),這個重定向只是臨時地從舊地址A跳轉到地址B,搜索引擎會抓取新的內容而保存舊的網址。