HTTP 重定向详解
背景
最近在做HTTP组件表单上传的需求,遇到一个疑问,当Post表单时,服务器端返回重定向状态码,重定向以后的请求是转换成GET,还是继续使用POST。
重定向状态码
以下内容主要来自于Mozilla,有兴趣可以看下原文
状态码 | 说明 | 重定向处理方法 |
---|---|---|
301 Moved Permanently | 永久重定向 | GET方法不变,其他无明确规定 |
302 Found | 临时重定向 | GET方法不变,其他无明确规定 |
303 See Other | 对POST/PUT请求进行重定向,防止刷新页面后重新提交请求 | 重定向后变为GET请求 |
307 Temporary Redirect | 临时重定向 | 重定向后使用原来的Method和Body |
308 Permanent Redirect | 永久重定向 | 重定向后使用原来的Method和Body |
- 关于301/302
虽然 RFC 1945 和 RFC 2068 规范不允许客户端在重定向时改变请求的方法,但是很多现存的浏览器在收到302响应时,直接使用GET方式访问在 Location 头部中规定的 URI,而无视原先请求的方法。
因此,RFC 7231 增加了 状态码307,规定了重定向以后继续使用原来的method和body。
重定向规则
根据RFC 2616 定义:
- 响应实体必须带有一个HTTP Location头部来指示新地址。
- 如果一个客户端有链接编辑能力,其应当把所有的引用链接重定向到新的URL上。
- 除非带有 Cache-Control 或 Expires 头部,否则该响应不能被缓存。
- 除非请求方法是 HEAD, 否则响应实体应该包含一个小型的超文本,标注一个超链接到新的URL。
- 如果是除了 GET 和 HEAD 之外的请求方法,客户端必须在重定向之前询问用户。
具体实现方法
由于作者实现的是一个底层组件,不具备重定向时询问用户的能力。因此采用的方案是:
- 301/302/303重定向时转为GET请求
- 307/308重定向时保持原来的请求