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[]");
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).