重定向状态码语义
301 与 302 在历史上被广泛混用,307 与 308 则明确规定必须保持请求方法与实体不变。抓包里看到重定向链时,要按具体码点判断客户端会不会改变方法:303 明确要求转成 GET,307 和 308 必须原样重发,这个差别对有请求体的接口影响很大。
基本信息
| 适用平台 | Wireshark 的 HTTP 解析,适用于各类客户端与服务器 |
|---|---|
| 过滤语法 | http.response.code >= 300 && http.response.code < 400 |
| 关键字段 | http.location 指定跳转目标 |
| 标准依据 | RFC 9110(状态码语义) |
典型使用场景
- 分析跳转链:数清跳数,核对每跳的目标域名与协议
- 排查方法被改写:POST 经过 302 可能变成 GET,导致参数丢失
- 检查协议降级:HTTPS 跳 HTTP 再跳回会增加往返
- 定位循环重定向:靠抓包里的跳数一眼看出
- 验证缓存策略:永久与临时重定向对客户端缓存的影响不同
跟随链路
跟随链路
http.response.code >= 300 && http.response.code < 400 # 全部重定向
http.response.code == 301 || http.response.code == 302 # 常见两种
http.location contains "example.com" # 按跳转目标筛选语义对照
| 码点 | 语义 | 方法是否保持 |
|---|---|---|
| 301 | 永久移动 | 历史上客户端多改为 GET |
| 308 | 永久移动 | 必须保持方法与实体 |
| 302 | 临时移动 | 历史上客户端多改为 GET |
| 307 | 临时移动 | 必须保持方法与实体 |
303 明确要求把后续请求改为 GET,常用于提交成功后的跳转。它是唯一一个语义上就要求改变方法的码点,和 307、308 的定位完全不同。
多跳重定向会显著增加页面加载时间,跨域名或跨协议跳转尤其明显。排查慢页面时把每一跳的耗时都算出来,往往能发现可观的浪费。
循环重定向在抓包里靠跳数一眼就能看出,浏览器通常只给一个通用错误提示,不会告诉你循环发生在哪里。
客户端跟随重定向时有跳数上限,超过上限通常直接报错。抓包里出现一串指向不同域名的 302,往往说明链路里存在设计之外的多级跳转,应逐跳核对是否都必要。