HTTP 302
外觀
HTTP/HTTPS |
---|
版本 |
請求方法 |
報文主體 |
頭欄位 |
狀態碼 |
相關主題 |
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]
因此狀態碼303和307被添加了進來,用以明確服務器期待客戶端進行何種反應。[6]
相關條目
[編輯]參考來源
[編輯]- ^ 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).