今天下班的時候看到了一些重定向的基礎知識,也算開了眼界。之前也常常使用301和302,但歷來沒有使用過和了解過其餘的3XX的狀態碼,發現原來裏面涉及的知識和解決的問題的還很多。html
瀏覽器首先訪問服務器A的URL,服務器A返回帶着location爲B的URL的 header 和3XX的狀態碼,瀏覽器讀取響應的3XX狀態碼,獲取到頭部的 location,而後跳轉到服務器B的URL。
須要知道的,跳轉是瀏覽器發起的。若是服務器給一個非瀏覽器的終端返回了3XX的狀態碼,那有多是沒法完成重定向的。
某年,有個應該用已經運行很很長時間了,PHP寫的API接口。一直使用的是HTTP,常常被劫持,而後領導想替換成加密的HTTPS,可是客戶端不能發版。後來服務器端就考慮把全站的接口從HTTP 302到HTTPS,討論這個方案的可行性。若是知道上面的流程和知識這個方案立馬就PASS了。瀏覽器
表示資源永久性的跳轉到新的URL。
一個比較常見的案例就是老站遷移到新站,老站直接關閉後,老站的頁面已經被搜索引擎收錄了,這個時候使用永久重定向方案。
永久重定向兩個狀態碼
301,重定向請求一般會使用GET方法,無論原請求使用的是何種方法。
308,爲了補充301.重定向必須使用原請求的方法和包體訪問。緩存
表示資源只是臨時跳轉到新的URL
臨時重定向一共有五個狀態碼,經常使用也就相對應的兩個302和307.
302,重定向請求一般會使用GET方法,無論原請求使用的是何種方法。
303,並不表示資源變動,只是表示用新的URL的響應代替原請求。無論原請求使用的是何種方法。基本跟302一致,因此市面不多用303,都是使用302.
307,爲了補充302.重定向必須使用原請求的方法和包體訪問。
百度就是使用的307跳轉,瀏覽器輸入http://www.baidu.com 會307 到https://www.baidu.com服務器
300,該請求有多種可能的響應,瀏覽器能夠選擇它們其中的一個。服務器沒有任何標準能夠遵循去代替用戶來進行選擇。
304,告訴瀏覽器,所請求的內容距離上次訪問並無變化。 能夠直接從瀏覽器緩存裏獲取該資源。
後面兩種不經常使用。搜索引擎
使用比較多就是301 302 307 308加密
ERR_TOO_MANY_REDIRECTS
這個報錯挺常見的。若是訪問A頁面而後重定向訪問B,而後B又讓重定向訪問A,這樣就是循環重定向了。屢次重定向也會報這個錯。日誌
生產環境遇到過一次,有一第二天志上發現有ERR_TOO_MANY_REDIRECTS的報錯,可是在Nginx的配置上沒有找到 3XX的跳轉代碼啊,那怎麼循環跳轉的。後來看到了這段配置code
location / { try_files $uri $uri/ /index.html$is_args$args; }
後來發現根目錄下沒有index.html,uri不存在,而後uri/目錄也不存在,最後發起一個內部子請求到index.html.index.html不存在,又到location,反覆重定向。最後報錯 ERR_TOO_MANY_REDIRECTS。htm