@
learningman 301 和 302 由 HTTP/1.0 引入,但部分浏览器对重定向后的请求方法实现不一致( GET 请求跳转后还是 GET ,但其他请求跳转之后有可能会变成 GET ,也有可能不变,取决于浏览器实现)
308 和 307 由 HTTP/1.1 引入,分别对应 301 和 302 ,但是标准化规定了重定向后的请求方法与原始方法一致,保持不变。
303 现在用的很少了,表示重定向后请求方法变为 GET 。通常是用在表单 POST 提交后重定向刷新页面的(以前用原始 form 表单直接 submit ,POST 提交到当前 url ,然后再重定向回当前 url ,服务端 url 一样,根据 method 来判断执行的操作,使用 303 重定向后方法会变回 GET )。不过现在基本上很少用 form 直接提交了,所以 303 用的就少了。
总的来说,就是部分浏览器把 301 、302 按照 303 来实现了,308 和 307 是用来纠正这个错误的。所以在 HTTP/1.1 之后是推荐使用更明确的 308 、307 了。HTTP/1.1 是 1999 年标准化的,所以可以理解是现在的客户端全部都支持的。
301 、308 表示永久重定向,所以浏览器会缓存目标地址响应,以后请求原地址在缓存有效的情况下都会直接自动转到新地址。
302 、307 表示临时重定向,所以浏览器不会缓存,以后访问原地址的时候还是会重新请求一下,看一下是否还需要跳转。