基本是对的。
301、302 在 HTTP 协议里确实规定了要以原谓词重新发起新的重定向请求,但实际的所有主流库都实现成不管第一次是啥谓词、重定向后都变成了 GET
。之所以说是 “主流库”,是因为不仅仅是浏览器,也包含 HTTP 的编程库(如 Java 中的 HttpClient
类)。为了不造成兼容性问题,也就这么着了,在错误的道路上继续大踏步前进。
后来为了解决这一问题,又先后提出了 302 的进化版 303/307、以及 301 的进化版 308 等几个新状态码。
不过要注意的是,这几个新状态码并不是一开始就随着 HTTP/1.1 一起被提出的,而是在 2014 年才制订出的 RFC-7231、RFC-7538 里才提出,作为 HTTP/1.1 协议的补充。
这时候距离 HTTP/1.1 诞生都已经过去十几年了,某些 Web 应用出现的比这俩 RFC 规范还要早,已经把这些状态码用作私有的定义了,所以实际上,又出现了当年 302 的老问题。
P.S. 一开始 301/302 为啥实现和设计有出入,究竟是哪个浏览器或编程库搞错了,关于这一点我没找到相关的信息。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…