301/302/307/308 与重定向

2,123 阅读1分钟
  • 301,Moved Permanently。永久重定向,该操作比较危险,需要谨慎操作:如果设置了 301,但是一段时间后又想取消,但是浏览器中已经有了缓存,还是会重定向
  • 302,Found。临时重定向,但是会在重定向的时候改变 method:把 POST 改成 GET,于是有了 307。
  • 307,Temporary Redirect。临时重定向,在重定向时不会改变 method。
  • 308,Permanent Redirect。永久重定向,在重定向时不会改变 method。

Location Header

在 HTTP 重定向时,会使用 Location 响应头来指明重定向后的地址。HTTP 的 Header 不区分大小写,因此以下的 locationLocation 相同。

# Github 301 示例
$ curl --head https://www.github.com
HTTP/2 301
content-length: 0
location: https://github.com/

# zhihu 301 示例
$ curl --head https://zhihu.com
HTTP/1.1 301 Moved Permanently
Server: CLOUD ELB 1.0.0
Date: Sun, 14 Aug 2022 17:00:07 GMT
Content-Type: text/html
Content-Length: 182
Connection: keep-alive
Location: https://www.zhihu.com/
X-Backend-Response: 0.000
Vary: Accept-Encoding
Referrer-Policy: no-referrer-when-downgrade
X-SecNG-Response: 0
x-lb-timing: 0.001
x-idc-id: 2
Set-Cookie: KLBRSID=e42bab774ac0012482937540873c03cf|1660496407|1660496407; Path=/

# zhihu 302 示例,登录首页将会 302 重定向到 //www.zhihu.com/signin?next=%2F 登录页面
$ curl --head https://www.zhihu.com
HTTP/2 302
server: CLOUD ELB 1.0.0
date: Sun, 14 Aug 2022 17:06:57 GMT
content-type: text/html; charset=utf-8
set-cookie: _zap=2937e593-b374-460e-8682-0a0f57ae3336; path=/; expires=Tue, 13 Aug 2024 17:06:57 GMT; domain=.zhihu.com
set-cookie: _xsrf=d2864bd9-a40d-44ee-9798-12ed9a89b981; path=/; domain=.zhihu.com
content-security-policy: default-src * blob:; img-src * data: blob: resource: t.captcha.qq.com *.dun.163yun.com *.dun.163.com *.126.net *.nosdn.127.net nos.netease.com; connect-src * wss: blob: resource:; frame-src 'self' *.zhihu.com mailto: tel: weixin: *.vzuu.com mo.m.taobao.com getpocket.com note.youdao.com safari-extension://com.evernote.safari.clipper-Q79WDW8YH9 mtt: zhihujs: captcha.guard.qcloud.com pos.baidu.com dup.baidustatic.com openapi.baidu.com wappass.baidu.com passport.baidu.com *.cme.qcloud.com vs-cdn.tencent-cloud.com t.captcha.qq.com *.dun.163yun.com *.dun.163.com *.126.net *.nosdn.127.net nos.netease.com; script-src 'self' blob: *.zhihu.com g.alicdn.com qzonestyle.gtimg.cn res.wx.qq.com open.mobile.qq.com 'unsafe-eval' unpkg.zhimg.com unicom.zhimg.com resource: captcha.gtimg.com captcha.guard.qcloud.com pagead2.googlesyndication.com cpro.baidustatic.com pos.baidu.com dup.baidustatic.com i.hao61.net jsapi.qq.com 'nonce-0d319f97-92d9-4cec-99b4-f5b63d711817' hm.baidu.com zz.bdstatic.com b.bdstatic.com imgcache.qq.com vs-cdn.tencent-cloud.com www.mangren.com www.yunmd.net zhihu.govwza.cn ssl.captcha.qq.com t.captcha.qq.com *.dun.163yun.com *.dun.163.com *.126.net *.nosdn.127.net nos.netease.com; style-src 'self' 'unsafe-inline' *.zhihu.com unicom.zhimg.com resource: captcha.gtimg.com www.mangren.com ssl.captcha.qq.com t.captcha.qq.com *.dun.163yun.com *.dun.163.com *.126.net *.nosdn.127.net nos.netease.com; frame-ancestors *.zhihu.com
x-content-security-policy: default-src * blob:; img-src * data: blob: resource: t.captcha.qq.com *.dun.163yun.com *.dun.163.com *.126.net *.nosdn.127.net nos.netease.com; connect-src * wss: blob: resource:; frame-src 'self' *.zhihu.com mailto: tel: weixin: *.vzuu.com mo.m.taobao.com getpocket.com note.youdao.com safari-extension://com.evernote.safari.clipper-Q79WDW8YH9 mtt: zhihujs: captcha.guard.qcloud.com pos.baidu.com dup.baidustatic.com openapi.baidu.com wappass.baidu.com passport.baidu.com *.cme.qcloud.com vs-cdn.tencent-cloud.com t.captcha.qq.com *.dun.163yun.com *.dun.163.com *.126.net *.nosdn.127.net nos.netease.com; script-src 'self' blob: *.zhihu.com g.alicdn.com qzonestyle.gtimg.cn res.wx.qq.com open.mobile.qq.com 'unsafe-eval' unpkg.zhimg.com unicom.zhimg.com resource: captcha.gtimg.com captcha.guard.qcloud.com pagead2.googlesyndication.com cpro.baidustatic.com pos.baidu.com dup.baidustatic.com i.hao61.net jsapi.qq.com 'nonce-0d319f97-92d9-4cec-99b4-f5b63d711817' hm.baidu.com zz.bdstatic.com b.bdstatic.com imgcache.qq.com vs-cdn.tencent-cloud.com www.mangren.com www.yunmd.net zhihu.govwza.cn ssl.captcha.qq.com t.captcha.qq.com *.dun.163yun.com *.dun.163.com *.126.net *.nosdn.127.net nos.netease.com; style-src 'self' 'unsafe-inline' *.zhihu.com unicom.zhimg.com resource: captcha.gtimg.com www.mangren.com ssl.captcha.qq.com t.captcha.qq.com *.dun.163yun.com *.dun.163.com *.126.net *.nosdn.127.net nos.netease.com; frame-ancestors *.zhihu.com
x-webkit-csp: default-src * blob:; img-src * data: blob: resource: t.captcha.qq.com *.dun.163yun.com *.dun.163.com *.126.net *.nosdn.127.net nos.netease.com; connect-src * wss: blob: resource:; frame-src 'self' *.zhihu.com mailto: tel: weixin: *.vzuu.com mo.m.taobao.com getpocket.com note.youdao.com safari-extension://com.evernote.safari.clipper-Q79WDW8YH9 mtt: zhihujs: captcha.guard.qcloud.com pos.baidu.com dup.baidustatic.com openapi.baidu.com wappass.baidu.com passport.baidu.com *.cme.qcloud.com vs-cdn.tencent-cloud.com t.captcha.qq.com *.dun.163yun.com *.dun.163.com *.126.net *.nosdn.127.net nos.netease.com; script-src 'self' blob: *.zhihu.com g.alicdn.com qzonestyle.gtimg.cn res.wx.qq.com open.mobile.qq.com 'unsafe-eval' unpkg.zhimg.com unicom.zhimg.com resource: captcha.gtimg.com captcha.guard.qcloud.com pagead2.googlesyndication.com cpro.baidustatic.com pos.baidu.com dup.baidustatic.com i.hao61.net jsapi.qq.com 'nonce-0d319f97-92d9-4cec-99b4-f5b63d711817' hm.baidu.com zz.bdstatic.com b.bdstatic.com imgcache.qq.com vs-cdn.tencent-cloud.com www.mangren.com www.yunmd.net zhihu.govwza.cn ssl.captcha.qq.com t.captcha.qq.com *.dun.163yun.com *.dun.163.com *.126.net *.nosdn.127.net nos.netease.com; style-src 'self' 'unsafe-inline' *.zhihu.com unicom.zhimg.com resource: captcha.gtimg.com www.mangren.com ssl.captcha.qq.com t.captcha.qq.com *.dun.163yun.com *.dun.163.com *.126.net *.nosdn.127.net nos.netease.com; frame-ancestors *.zhihu.com
x-frame-options: SAMEORIGIN
strict-transport-security: max-age=15552000; includeSubDomains
surrogate-control: no-store
pragma: no-cache
expires: 0
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
location: //www.zhihu.com/signin?next=%2F
x-backend-response: 0.001
vary: Accept-Encoding
referrer-policy: no-referrer-when-downgrade
x-secng-response: 0.005000114440918
x-lb-timing: 0.006
x-idc-id: 2
set-cookie: KLBRSID=b33d76655747159914ef8c32323d16fd|1660496817|1660496817; Path=/
cache-control: private, must-revalidate, no-cache, no-store, max-age=0
content-length: 93
x-nws-log-uuid: 3658595918315504587
x-cache-lookup: Cache Miss
x-edge-timing: 0.042
x-cdn-provider: tencent

Response Body ?

301/302/307/308 响应有 Response Body 吗?

有,如上示例,知乎的重定向就包含响应体。

# 知乎的响应体是一段文字
$ curl https://www.zhihu.com
Redirecting to <a href="//www.zhihu.com/signin?next=%2F">//www.zhihu.com/signin?next=%2F</a>.

# 可通过 content-length 响应头获取响应体的长度
$ curl -s --head https://www.zhihu.com | grep content-length
content-length: 93

client and follow redirect

在客户端发送请求时,如果发现某网址经重定向,则可再次向重定向后的网址发送请求。一些 HTTP 客户端工具,则会自动集成该功能,比如 curl 通过 --location 即可。

$ curl --head --location https://zhihu.com

fetch API 中,也可以通过 follow 控制是否追踪重定向。

fetch('https://zhihu.com', { follow: 'redirect' })

实例

我在 Apifox 中演示了知名网站关于重定向的实例。见文档