HTTP 302
HTTP回應狀態碼
302 Found,原始描述短語為Moved Temporarily,是HTTP協定中的一個狀態碼(Status Code)。可以簡單的理解為該資源原本確實存在,但已經被臨時改變了位置;換而言之,就是請求的資源暫時駐留在不同的URI下[1],故而除非特別指定了快取頭部指示,該狀態碼不可快取。
對於伺服器,通常會給瀏覽器傳送HTTP Location頭部來重新導向到新的新位置。
定義
根據定義[2][3][4],該響應代碼的使用場景是,請求的資源暫時駐留在不同的URI下。
其特徵被定義為:
- 客戶端收到的新的URI,不是原始請求資源的替代參照。
- 只有當伺服器發出Cache-Control或Expires頭欄位進行指示,此響應才能被快取,否則不能被快取。
- 臨時URI應該由響應頭部中的Location欄位給出。
- 除非請求方法是HEAD ,否則響應的實體應該包含一個帶有超連結到新的URI的短HTML註釋。
- 如果在除GET或HEAD兩種請求方法之外的請求時,接收到302狀態碼,客戶端不得自動重新導向請求,除非用戶可以確認;否則可能會更改發出請求的條件。
- 如果一個客戶端有連結編輯能力,其應當把所有的參照連結重新導向到新的URL上。
- 重新導向到新地址時,客戶端必須使用GET方法請求新地址。
例子
客戶端請求:
GET /blog HTTP/1.1
Host: www.example.com
第一種伺服器回應,不帶快取頭:
HTTP/1.1 302 Found
Location: https://www-temp.example.org/
第二種伺服器回應,帶快取頭:
HTTP/1.1 302 Found
Location: https://www-temp.example.org/
Cache-control: private; max-age=600
伺服器組態
這是一個例子,展示如
^www\.(.*)$ [NC] RewriteRule ^ RewriteRule ^(.*)$ https://example.com/$1{{Dead link|date=2019年10月 |bot=InternetArchiveBot |fix-attempted=yes }} [R,L]
等價的Nginx組態方式:
location /old/url/ { return 302 /new/url; }
這是使用PHP實現HTTP 302重新導向的方式:
<?php
header("HTTP/1.1 302 Found");
header("Location: http://example.com/newpage.html%5B%5D");
exit();
?>
客戶端實現問題
雖然RFC 1945和RFC 2068兩個規範不允許客戶端在重新導向時改變請求的方法,但是很多現存的瀏覽器將302響應視作為303響應 ,並且逕自使用GET方式訪問在Location中規定的 URI,而無視原先請求的方法,這是不規範的實現。[5]
相關條目
參考來源
- ^ W3C: 10 Status Code Definitions. [2014-06-01]. (原始內容存檔於2010-03-16).
- ^ T., Fielding, Roy; Tim, Berners-Lee,; Henrik, Frystyk,. Hypertext Transfer Protocol -- HTTP/1.0. tools.ietf.org. [2017-07-04]. (原始內容存檔於2010-11-30) (英語).
- ^ C., Mogul, Jeffrey; Jim, Gettys,; Tim, Berners-Lee,; Henrik, Frystyk,. Hypertext Transfer Protocol -- HTTP/1.1. tools.ietf.org. [2017-07-04]. (原始內容存檔於2018-06-07) (英語).
- ^ J., Leach, Paul; Tim, Berners-Lee,; C., Mogul, Jeffrey; Larry, Masinter,; T., Fielding, Roy; James, Gettys,. Hypertext Transfer Protocol -- HTTP/1.1. tools.ietf.org. [2017-07-04]. (原始內容存檔於2011-03-07) (英語).
- ^ Reference of method redirect_to in Ruby Web Framework "Ruby on Rails". It states: The redirection happens as a "302 Moved" header unless otherwise specified.. [2012-06-30]. (原始內容存檔於2012-07-05).
- ^ Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content, Section 6.4. IETF. [2014-06-12]. (原始內容存檔於2017-05-25).