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 1945RFC 2068兩個規範不允許客戶端在重新導向時改變請求的方法,但是很多現存的瀏覽器將302回應視作為303回應 ,並且逕自使用GET方式訪問在Location中規定的 URI,而無視原先請求的方法,這是不規範的實現。[5]

因此狀態碼303和307被添加了進來,用以明確伺服器期待客戶端進行何種反應。[6]

相關條目

參考來源

  1. ^ W3C: 10 Status Code Definitions. [2014-06-01]. (原始內容存檔於2010-03-16). 
  2. ^ T., Fielding, Roy; Tim, Berners-Lee,; Henrik, Frystyk,. Hypertext Transfer Protocol -- HTTP/1.0. tools.ietf.org. [2017-07-04]. (原始內容存檔於2010-11-30) (英語). 
  3. ^ 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) (英語). 
  4. ^ 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) (英語). 
  5. ^ 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). 
  6. ^ Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content, Section 6.4. IETF. [2014-06-12]. (原始內容存檔於2017-05-25). 

外部連結