http状态码301、302、303、307、308的区别
3xx开头的状态码都表⽰重定向。
先说明⼀些版本问题, 301和302都是http1.0就定义好的,303、307、308都是在http1.1中才新增的状态码。
301 Mo ved Per m a nently 永久重定向
在请求的 URL 已被移除时使⽤。响应的 Location ⾸部中应该包含 资源现在所处的 URL。
网站页面设计原则默认情况下,永久重定向是会被浏览器缓存的。
302 Fo und 临时重定向
与 301 状态码类似;但是,客户端应该使⽤ Location ⾸部给出的 URL 来临时定位资源。将来的请求仍应使⽤⽼的URL。
在浏览器的实现中,302默认以get重新发出请求。⽐如 以post访问 a ,⽤302重定向到b,浏览器会使⽤get请求b。但这样就会导致之前的post请求数据丢失,相对的 307不允许修改请求⽅法,这也是302和307最⼤的区别
在rfc1945 中规定:
If the 302 status code is received in response to a request using
the POST method, the user agent must not automatically redirect the
request unless it can be confirmed by the user, since this might
change the conditions under which the request was issued.
这段英⽂⼤意:如果对post请求返回了302状态码, 在未经⽤户确认的情况下不允许擅⾃发送请求,因为可能会修改请求条件。
在post数据量⼤的情况下从post改为get,肯定会丢失很多参数。但是很多浏览器都是以get⽅式重定向的,所以在后来的rfc7231 中取消了这⼀段强制要求,并将此要求放在了307状态码中。
303 See Other 临时重定向
303 是为了区分302⽽存在的。
:
虽然 RFC 1945 和 RFC 2068 规范不允许客户端在重定向时改变请求的⽅法,但是很多现存的浏览器在收到302响应时,直接使⽤GET⽅式访问在Location中规定的URI,⽽⽆视原先请求的⽅法。因此状态码303被添加了进来,⽤以明确服务器期待客户端进⾏何种反应。重定向到新地址时,客户端必须使⽤GET⽅法请求新地址。
307 Tem po 307 Tempo r a r y R edirec t
这个状态码和302相似,有⼀个唯⼀的区别是不允许将请求⽅法从post改为get。
[2][3]
在rfc7231的原话如下:
Note: This status code is similar to 302 (Found), except that it does not allow changing the request method from POST to GET
308 Perm a
Perma nent R edirec t 永久重定向
rfc7538 新增的状态码
fseek fp 0 2此状态码类似于301(永久移动),但不允许更改从POST到GET的请求⽅法。
308是307的永久版本,和307是⼀对
来个总结:
永久重定向有两个: 301和308。
两者都默认缓存,
但是308不允许将请求⽅法从POST修改到GET, 301允许。
临时重定向三个:302,303,307
303强制浏览器可以将请求⽅法从POST修改到GET
307不允许浏览器修改请求⽅法。
302⼀开始的标准是不允许修改POST⽅法,但是浏览器的实现不遵循标准,标准就向现实妥协⽽做了修改。
另外,关于默认缓存的响应头:
Responses with status codes that are defined as cacheable by default
(e.g., 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501 in
c语言switch语句break的作用this specification) can be reused by a cache with heuristic
expiration unless otherwise indicated by the method definition or
explicit cache controls all other status codes are not cacheable by default.
position和location的区别这⼀段是在rfc7231中说明的,在 rfc7538⼜说明了 308是默认缓存的。
参考
HTTP中的301、302、303、307、308
10进制80的16进制是多少知乎:HTTP 中的 301、302、303、307、308 响应状态码(这⼀篇总结的⽐较好)
rfc7231 ⽂档
rfc7538 ⽂档
303 (我发现中⽂版和英⽂版内容不⼀样,中⽂版可能过期了,建议看英⽂版。)java模拟器iphone版
《http 权威指南》
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论