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). 

外部連結

編輯