301 Moved Permanently
301 轉址代表什麼、和 302、307、308 差在哪裡,以及為什麼被轉址的 POST 會變成 GET 抵達。
在你的瀏覽器中執行
點一下代碼即可複製。
你要的東西在別的地方,或是根本沒有變過。
| 代碼 | 意義 |
|---|---|
| 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 常常會多出你 沒寫過的跳數。