HTTP 302

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

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

外部連結[編輯]