HTTP中的301、302、303、307、308
程序员文章站
2022-07-05 11:18:05
结论 3XX开头的HTTP状态码都表示重定向的响应。 301、308是永久重定向;302、303、307是临时重定向。 301、302是http 1.0的内容,303、307、308是http1.1的内容。 301和302本来在规范中是不允许重定向时改变请求method的(将POST改为GET),实 ......
结论
- 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请求上。