结论
- 3XX开头的HTTP状态码都表示重定向的响应。
- 301、308是永久重定向;302、303、307是临时重定向。
- 301、302是http 1.0的内容,303、307、308是http1.1的内容。
- 301和302本来在规范中是不允许重定向时改变请求method的(将POST改为GET),实际许多浏览器实现的时候允许重定向时改变请求method。
- 303的出现是允许重定向时改变请求method。此外303响应禁止被缓存。307、308则不允许重定向时改变请求method。
RFC 7231规定:
- 301 Moved Permanently,永久重定向
- 302 Found
- 303 See Other
- 307 Temporary Redirect
RFC 7538规定:
- 308 Permanent Redirect 永久重定向
301、302搜索引擎处理区别
- 301表示搜索引擎在抓去新内容的同时,将旧的网址替换为重定向之后的网址;
- 302表示旧地址的资源仍存在,重定向时临时从A地址跳转到B地址,搜索引擎会抓取新的内容,并继续保存旧的网址。
临时重定向:302、303与307
结论
- 302允许各种各样的重定向,一般都实现为GET到GET重定向,但是不能确保POST会重定向为POST。
- 303只允许任意请求到GET的重定向。
- 307和302一样,但不允许POST到GET的重定向。
302 Found
- 302表示目标资源临时移动到了另一个URI上。由于重定向是临时发生的,所以客户端之后的请求中应该使用原本的URI。
- 响应header的Location会带上重定向的URI,浏览器可以使用Location中的URI进行自动重定向。
- 注意:由于历史原因,用户代理可能会在重定向后的请求中把POST方法改为GET。如果不想这样做,应该响应307(Temporary Redirect)状态码。
303 See Other
- 303表示服务器要将浏览器重定向到另一个资源,这个资源的URI会写在响应Header的Location字段。事实上,重定向到的资源并不是请求的资源,而是对请求资源的一些描述。
- 303 通常用于将POST请求重定向到GET请求。例如上传了一份个人信息,服务器返回303响应,将你导向一个上传成功页面。
- 303 不管原请求是什么方法,重定向请求的都是GET(或者HEAD)
- 303响应禁止被缓存。
307 Temporary Redirect
- 307的定义实际上和302是一致的,唯一区别在于,307状态码不允许浏览器将原本POST的请求重定向到GET请求上。
永久重定向:301、308
301 Moved Permanently
- 301表明目标资源被永久的移动到了一个新的URI,任何未来对这个资源的引用都应该使用新的URI。
308 Permanent Redirect
- 308与301定义一致,唯一的区别在于,308状态码不允许浏览器将原本为POST的请求重顶到GET请求上。
参考: