https://zhuanlan.zhihu.com/p/60669395
上面這兩篇蠻有幫助的。
想想下面這個情境。
假設你原本的網站叫做 old.com
後來你換了一個域名,叫做 new.com
再轉換初期你一定是要兩個都保持,不然原本都用 A.com 連線的小朋友們不知道你連到 B.com,他們就不知你的網站到哪裡去了。就像你的店名原本叫台南牛肉麵,突然你想要愛逮丸一點,叫做台灣牛肉麵,但其他人只知道台南牛肉麵,一直問台南牛肉麵在哪裡,殊不知你已經改名子了(好啦,如果問人一定還是知道台灣牛肉麵就是以前的台南牛肉麵)。
所以在換域名初期你會兩個域名都先保留,等大家都記住 new.com 的時候在把 old.com 關掉。
但是大家都還是用 old.com 連怎麼辦?我們會把 IP 掛到 new.com,然後 old.com 用 redirect 的方式導到 new.com。
那我們要怎麼 Redirect?我們可以透過下面幾種方式
- response header 的 location
- HTML 的 meta 元素 HTML 重新導向機制
- JS 的
window.location = URL
。
後面兩個可能比較不熟悉,這裡不詳細講這個東西,可以看這邊 設定重新導向的其他方法
平常我們輸入 domain name 之後的流程是這樣的:
- client: old.com => DNS server
- DNS server: IP => client
- client: IP => server
- server: response => client
當我們拿到 IP 之後,為了減少之後重新向 DNS server request,所以瀏覽器有 cache 會記錄 域名 還有 IP的對,減少向 DNS request 的次數。那如果平常重新導向,會是這樣的流程
- client: old.com => DNS server
- DNS server: IP => client
- client: IP => server
- server: response(根據 domain name) redirect to new.com => client
- cient : new.com => DNS server
- DNS server: IP => client
- client: IP => server
在第四個步驟 server: response(根據 domain name)
有個很重要的點,就是 Status code 這會影響到瀏覽器重新導向的方式,簡單來說重導向需要考慮的點有幾個。
永久還是臨時
這個東西的影響層面跟瀏覽器還有搜尋引擎有關係。
剛剛有提到說瀏覽器會用 cache 紀錄域名還有 IP,如果是永久導向,那麼瀏覽器就會修改紀錄,例如像剛剛的流程,假如我們是永久導向。
- 使用者輸入 old.com
- 瀏覽器翻了 cache 發現這樣一筆紀錄 old.com: 3.444.555.666 了,指向到 3.444.555.666,直接向 3.444.555.666 發送 request。
- reponse 顯示:永久 redirect to new.com
- new.com 發現 cache 裡面沒有,所以向 DNS 找找,於是找到 3.444.555.666
- 瀏覽器發現說這個網頁已經永久導向了,所以修改剛剛的紀錄變成 old.com: new.com, new.com: 3.444.555.666。
所以之後如果我們要搜尋 new.com 就不會再找 DNS了,而且輸入 old.com 也不會再重新發 request 到 old.com,因為已經紀錄說 old.com 已經導向到 new.com
如果是臨時導向呢?就不會有改紀錄這個動作,還是會重複原本的步驟。
要注意的是,並不一定 new.com 跟 old.com 都在同一個 server 上,也有可能在不同 server,像是短網址的服務,或者是你整個部落格也跟著搬 server 換 IP 也有可能。
而決定永久還是臨時的就是靠 status code
- 永久: 301, 308
- 臨時: 302, 303, 307
- 其他:
- 304 會被導到舊網頁
- 300 用戶可以自己選
重導向之後的 request method 還有 body
還有一個問題是,如果發出的 request 不是 get 呢?例如說:你是發送表單,用的是 POST method,而且夾帶著 form data,結果 request 之後 method 變成 get,那就完全送不出資料了。
所以另外一個考量點就是,redirect 之後的 request method 還有 body。
有幾種選項
- GET 不變、其他 method 可能會變成 GET: 303
- method 跟 body 都不會變:307, 308
為什麼沒有 301 跟 302 ?因為當初規範沒有講清楚這個東西,所以一個規範各表,變成有些有些有改、有些沒改。上面的 303, 307, 308 就是為了統一所以提出的新規範。
關於 rediredct 的 status code 大概是這樣,感謝大家收看。
使用情境可以看這邊