HTTP 规范中定义了返回码为 3xx
代表客户端需要做一些额外的工作来完成请求,大部分3xx
用来做转发(redirect)。
状态码的详细说明可以参照规范或者 wikipedia、维基百科, 以下是代码的简短介绍。
- 300 Multiple Choices: 返回多个可供选择的资源
- 301 Moved Permanently: 请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一
- 302 Found: 请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求,HTTP 1.0中的意义是
Moved Temporarily
,但是很多浏览器的实现是按照303的处实现的,所以HTTP 1.1中增加了 303和307的状态码来区分不同的行为
- 303 See Other (since HTTP/1.1): 对应当前请求的响应可以在另一个URI上被找到,而且客户端应当采用GET的方式访问那个资源
- 304 Not Modified (RFC 7232): 请求的资源没有改变
- 305 Use Proxy (since HTTP/1.1): 被请求的资源必须通过指定的代理才能被访问
- 306 Switch Proxy: 在最新版的规范中,306状态码已经不再被使用
- 307 Temporary Redirect (since HTTP/1.1): 请求的资源现在临时从不同的URI响应请求,和303不同,它还是使用原先的Method
- 308 Permanent Redirect (RFC 7538): 请求的资源已永久移动到新位置,并且新请求的Method不能改变
Go 的 http 库在实现的过程中也在不断的完成和修改其中的Bug,在 1.8版本中解决了前面版本中实现的问题 (你可以在 Go issues中搜索 redirect 来查看相关的issue)。 本文梳理了 Go 中 Redirect 的相关知识,以便你在遇到转发的问题时心中有数。
阅读全文