http 状态码301、302、303、307、308 的区别

 我来答
舒适还明净的海鸥i
2022-07-23 · TA获得超过1.7万个赞
知道小有建树答主
回答量:380
采纳率:0%
帮助的人:68.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 权威指南》
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式