首页/网络/抓包与流量分析速查/重定向状态码语义对照
应用层报文判读71 条

重定向状态码语义对照

301/302 历史上被广泛混用,307/308 明确保持方法与实体:抓包看到重定向链要按码点判断客户端是否可能改变方法。

重定向状态码语义

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,往往说明链路里存在设计之外的多级跳转,应逐跳核对是否都必要。

易错点

  • HTTPS 站点跳到 HTTP 又跳回会产生额外往返,链路里数一数
  • 循环重定向靠抓包跳数一眼看出,浏览器可能只报通用错误
  • 有请求体的接口遇到 301 或 302 可能被客户端改成 GET,表现为参数丢失
  • 只看到响应码不核对跳转目标,会把跨域跳转误判成同域重试

数据来源与参考

  • RFC 9110(重定向)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌