http 状态码301、302、303、307、308 的区别
1个回答
展开全部
3xx开头的状态码都表示重定向。
先说明一些版本问题, 301和302都是http1.0就定义好的,303、307、308都是在http1.1中才新增的状态码。
默认情况下,永久重定向是会被浏览器缓存的。
在浏览器的实现中,302默认以get重新发出请求。比如 以post访问 a.com ,用302重定向到b.com,浏览器会使用get请求b.com。但这样就会导致之前的post请求数据丢失,相对的 307不允许修改请求方法,这也是302和307最大的区别
在 rfc1945 中规定:
这段英文大意:如果对post请求返回了302状态码, 在未经用户确认的情况下不允许擅自发送请求,因为可能会修改请求条件。
在post数据量大的情况下从post改为get,肯定会丢失很多参数。但是很多浏览器都是以get方式重定向的,所以在后来的 rfc7231 中取消了这一段强制要求,并将此要求放在了307状态码中。
303 是为了区分302而存在的。
这个状态码和302相似,有一个唯一的区别是不允许将请求方法从post改为get。
在 rfc7231 的原话如下:
rfc7538 新增的状态码
308是307的永久版本,和307是一对
永久重定向有两个: 301和308。
两者都默认缓存,
但是308不允许将请求方法从POST修改到GET, 301允许。
临时重定向三个:302,303,307
303强制浏览器可以将请求方法从POST修改到GET
307不允许浏览器修改请求方法。
302一开始的标准是不允许修改POST方法,但是浏览器的实现不遵循标准,标准就向现实妥协而做了修改。
另外,关于默认缓存的响应头:
参考
HTTP中的301、302、303、307、308
知乎:HTTP 中的 301、302、303、307、308 响应状态码 (这一篇总结的比较好)
rfc7231 文档
rfc7538 文档
维基百科 303 (我发现中文版和英文版内容不一样,中文版可能过期了,建议看英文版。)
《http 权威指南》
先说明一些版本问题, 301和302都是http1.0就定义好的,303、307、308都是在http1.1中才新增的状态码。
默认情况下,永久重定向是会被浏览器缓存的。
在浏览器的实现中,302默认以get重新发出请求。比如 以post访问 a.com ,用302重定向到b.com,浏览器会使用get请求b.com。但这样就会导致之前的post请求数据丢失,相对的 307不允许修改请求方法,这也是302和307最大的区别
在 rfc1945 中规定:
这段英文大意:如果对post请求返回了302状态码, 在未经用户确认的情况下不允许擅自发送请求,因为可能会修改请求条件。
在post数据量大的情况下从post改为get,肯定会丢失很多参数。但是很多浏览器都是以get方式重定向的,所以在后来的 rfc7231 中取消了这一段强制要求,并将此要求放在了307状态码中。
303 是为了区分302而存在的。
这个状态码和302相似,有一个唯一的区别是不允许将请求方法从post改为get。
在 rfc7231 的原话如下:
rfc7538 新增的状态码
308是307的永久版本,和307是一对
永久重定向有两个: 301和308。
两者都默认缓存,
但是308不允许将请求方法从POST修改到GET, 301允许。
临时重定向三个:302,303,307
303强制浏览器可以将请求方法从POST修改到GET
307不允许浏览器修改请求方法。
302一开始的标准是不允许修改POST方法,但是浏览器的实现不遵循标准,标准就向现实妥协而做了修改。
另外,关于默认缓存的响应头:
参考
HTTP中的301、302、303、307、308
知乎:HTTP 中的 301、302、303、307、308 响应状态码 (这一篇总结的比较好)
rfc7231 文档
rfc7538 文档
维基百科 303 (我发现中文版和英文版内容不一样,中文版可能过期了,建议看英文版。)
《http 权威指南》
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询