HTTP 的重定向

weixin_33936401發表於2019-01-19

一直好奇,當我們request一個URL時候,它是怎麼在後臺就轉向了。
瀏覽器是接收到什麼指令了才會被重定向?在Headers中?在文件中被JS指令碼重定向?還是什麼?

參考Mozilla超好看文件:HTTP 的重定向

也就是說,命令客戶端的瀏覽器對一個URL重定向的方法有:

  • (*) 通過Status Code+Headers: Location來命令瀏覽器重定向至Location的網址
  • HTML的頭部的<meta>標籤中設定重定向。但是隻適用於HTML,類似圖片等其它資源就不行了
  • Javascript指令碼中寫window.location="..."重定向。同樣只適用於能載入JS的客戶端,不適合其它資源。

通過Status Code狀態碼重定向

這種方法是最標準、適應度最廣泛的:也就是無需HMTL,無需瀏覽器,無需BODY,只要Headers即可要求接收者重定向。

原理圖:

image

要求重定向的狀態碼有:

  • 永久重定向
    • 301
    • 308
  • 臨時重定向
    • 302
    • 303
    • 307
  • 特殊重定向
    • 300
    • 304

Python獲取每次重定向的地址

一般來說,我們用requests的方法,

r = requests.get(uri, allow_redirects=True)
print( r.url )

for jump in r.history:
    print( jump.url )

但是最近在使用一些WebAPI時候,如Oauth2.0的時候,只有登入後才會重定向。
所以如果程式中沒有做到登入,後臺就不會重定向。也就是說,request的時候我們要加入cookies登入資訊,而且是對應著最開始response中的set cookies設定的cookies才能被重定向。


相關文章