toolfree

301 Moved Permanently

301 轉址代表什麼、和 302、307、308 差在哪裡,以及為什麼被轉址的 POST 會變成 GET 抵達。

在你的瀏覽器中執行

點一下代碼即可複製。

3xx · 重新導向

你要的東西在別的地方,或是根本沒有變過。

代碼意義
Moved Permanently已經永久搬走了,請更新你的連結。301 和 302 允許用戶端在重新導向時把 POST 換成 GET,而瀏覽器確實會這麼做。如果方法必須保留,請改用 308 或 307。
Found暫時在別的地方,請繼續使用原本這個網址。
See Other請改用 GET 去取另一個網址——表單送出完成後最常見的回應。
Not Modified你快取的版本仍然有效,不會回傳主體。
Temporary Redirect暫時在別的地方,而且請求方法不能改變。
Permanent Redirect永久搬到別的地方,而且請求方法不能改變。

它說了什麼

301 表示資源已經永久搬走,你應該更新所有指向舊位址的東西。新位址在 Location 標頭裡。

搜尋引擎會照做:它們會把排名訊號轉移到新網址,最終在索引中換掉舊的。這就是為什麼網站換 網域或重整路徑時,你要的是 301。

方法會被換掉的問題

這是真正會咬人的部分,而且知道的人不多。

**301 和 302 允許用戶端更換方法。**跟隨 301 的 POST 可能會被改成 GET 重新送出,而且不帶 主體。規格出於歷史因素允許這件事,瀏覽器也真的會做。所以用 301 去轉址一個表單送出,等於 默默地把那次送出弄丟了。

**307 和 308 禁止這件事。**它們的意思分別和 302、301 完全相同,只是多了一項保證:方法與 主體會在轉址後存活下來。

代碼永久?保留方法?
301
302
307
308

規則很簡單:只要請求有可能是 POST,就用 307 或 308。

303 是刻意反過來的那個

303 See Other 告訴用戶端改用 GET 去取另一個位址,是刻意要換掉方法的。它是表單完成後正確 的回應:瀏覽器會停在一個可以安全重新整理的結果頁,而不是被問要不要重新送出。

快取,以及為什麼 301 很難收回

瀏覽器會快取永久轉址,常常是無限期的,而且有時不會重新驗證。一個指錯地方的 301 可能在你 修好伺服器很久以後,仍然留在訪客的瀏覽器裡,而你沒有辦法遠端清掉它。

先用 302 測試,確定沒問題之後再改成 301。反過來走的代價比聽起來痛苦得多。

轉址鏈

每多一跳就多一次來回,而瀏覽器和爬蟲在幾跳之後就會放棄。請直接轉到最終位址,不要經過兩層 中間規則——也記得檢查你的主機自己加了什麼,HTTP 轉 HTTPS、以及裸網域轉 www 常常會多出你 沒寫過的跳數。