來源:https://datatracker.ietf.org/doc/html/rfc7538
【HTTP】The 3xx (Redirection) class of status code 介紹
Redirection 3xx:
這篇文章談談 HTTP 中轉址相關的狀態碼,也就是 3xx 系列的狀態碼。其中最廣為人知的就是 code 301 和 302,分別的對應永久與暫時轉址,兩個從用戶的角度看到的行為是一樣的但卻會對 SEO、CDN、瀏覽器 cache 等造成不同的影響。
身為網頁開發者在工作上使用他們的機會一定不少,如何根據需求正確設置 response code 就成了不可或缺的知識之一。以下的知識大多來自 rfc 7231 Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content,有關其他來源可以在文章最後的參考資料中看見。
300 Multiple Choices:
code 300 代表該 URL 指向的目標有多種選擇 (例如不同的畫質或檔案類型)。
如果 server 可以將自己認為的首選 URL 放置在 Location 這個 header 欄位中給 client,並將所有選項經由 body 傳遞給 client,且 code 300 預設是可以被 cache 的。不過 HTTP 協定並沒有規範這些 body 中選項的傳遞格式,導致 code 300 有很難被通用、使用率很低的問題。
301 Moved Permanently:
code 301 代表該 URL 已經被永久轉址到新的 URL,同時 server 應該在 Location 欄位中給予新 URL,且 code 301 預設是可以被 cache 的。
code 301 對於轉址時是否要依照原請求的 method (GET、POST、PUT、DELETE) 這點並沒有明確規定,部分瀏覽器會轉成 GET 來轉送。我認為這是因為 GET 以外 method 執行的多半是非安全性、會影響資料狀態的動作,自動轉址這樣的動作不是很安全的選擇。
302 Found:
code 302 代表該 URL 暫時被轉址到新的 URL,同時 server 應該在 Location 欄位中給予新 URL。code 302 可以讓 client 知道現在使用的 URL 是正確的,未來也應該繼續用,只是現在被暫時取代而已。
code 302 與 301 一樣沒有明確規定轉址時的 method 是否要依照原請求,部分瀏覽器會轉成 GET 來轉送。
303 See Other:
code 302 代表 server 要將 client 轉址到另一個 "不一樣" 的目標來取代原 URL,同時 server 應該在 Location 欄位中給予該目標的 URL。
A user agent can perform a retrieval request targeting that URI (a GET or HEAD request if using HTTP) |
對於新目標 URL,rfc 7231 表示 client 可以使用 GET 或 HEAD method 來轉址。其中一個常見的使用方式是在 PUT 或 POST 操作成功後回傳 303,將 client 轉址到另一個確認上傳狀態的頁面,使得這個操作被轉換成可以 cache、加入書籤的形式。
304 Not Modified:
code 304 代表該 URL 指向的目標並沒有被更動過,讓 client "轉向" 使用本地端的 cache 資料,通常是搭配 cache 相關的其他 header 欄位動作。
例如:由 client 提供目前本地 cache 的資訊並表示如果內容不符合 (If-None-Match) 或 cache 後被更動過 (If-Modified-Since) 時才需給予新資料,這時候 server 就有可能回傳 code 304 表示沒有更動過,client 可以持續使用 cache 內的資料。
307 Temporary Redirect:
code 307 代表該 URL 暫時被轉址到新的 URL,同時 server 應該在 Location 欄位中給予新 URL,與 302 是一樣的作用。
唯一的差別是 307 禁止 client 端更改 method,轉址後需要使用一樣的 method 來發請求。307、308 就是被設計來解決 301、302 method 可能被更改的問題。
308 Permanent Redirect:
code 308 代表該 URL 已經被永久轉址到新的 URL,同時 server 應該在 Location 欄位中給予新 URL,與 301 是一樣的作用。
唯一的差別是 308 禁止 client 端更改 method,轉址後需要使用一樣的 method 來發請求。
注意事項:
對於 client 來說,server 回傳的 code 3xx 大多會配合 Location 這個 header 欄位來告知 clent 端要被轉址到哪個 URL。但 rfc 7231 中描述的是 "應該" 給予 Location header 欄位,而不是必須。所以 client 要有辦法處理 server 回傳的 code 3xx 僅告知該 URL 已轉址但沒有給予 Location 的情況。
同時對於這些應該在 Location 欄位中給予新 URL 的 code,通常也都應該在 body 也產生一個該 URL 的超連結,不過這部分既不強制也沒有定義規格。
對於 server 來說,除了 301、302 未定義 HTTP method 要注意外,rfc 7231 還提到,只要 server 有回傳 Location 給 client,client 就 "可能" 會自動轉址,即便 server 端回傳的 code 是未知的也一樣。
而以上情況都沒有明確的定義 client 要怎麼動作,所以我們在作為 client 時要小心這些狀況的處裡,反之作為 server 時要明確清楚的給予 code 與 Location,不要仰賴這些不明確的情況。
總結:
其他未提到的可能是 305 Use Proxy 或 306 這種因為歷史痕跡被使用過後又停用的 code。撇除 cache 相關的 304,在現今網頁中最常遇到的就是 301、302、307、308 四種轉址 code。
|
永久 |
暫時 |
轉址 method 未規定 |
301 |
302 |
轉址 method 有規定 |
308 |
307 |
如同開頭所述,永久與暫時轉址會影響瀏覽器 cache 與 SEO,舉例來說 google bot 遇見永久轉址時會將原有 URL 上的分數以及歷史流量都移到新的 URL 上,並在搜尋結果中顯示轉址後的新內容。遇見暫時轉址時則會暫時不更新原 URL 的狀態,並在搜尋結果中顯示原內容,於過段時間後再次呼叫看看暫時轉址是否已結束。
網站更新、移站、維修中、短期活動案,我們有多種可能會需要做到轉址,若沒有依照需求正確使用永久與暫時,甚至有可能會違反 SEO 守則而被懲罰,需要多多注意,更詳細的 SEO 規則可以參考這篇 Google 官方說明。
參考資料:
[1] RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content
https://datatracker.ietf.org/doc/html/rfc7231
[2] RFC 7232 - Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests
https://datatracker.ietf.org/doc/html/rfc7232
[3] RFC 7538 - The Hypertext Transfer Protocol Status Code 308 (Permanent Redirect)
https://datatracker.ietf.org/doc/html/rfc7538
[4] 300 Multiple Choices - HTTP | MDN
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/300
[5] For which 3xx HTTP codes is the Location header mandatory? - Stack Overflow
[6] Redirects and Google Search | Google Search Central | Documentation | Google Developers
https://developers.google.com/search/docs/advanced/crawling/301-redirects
留言列表