用 curl -I 看一个旧链接只返回一条 301,浏览器里实际跳了三次才到,首屏多等七百毫秒,打开开发者工具才看到请求列表里还有两跳。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

curl -sIL -o /dev/null -w '%{url_effective} %{http_code} %{num_redirects}\n' https://example.com/old
curl -sI https://example.com/old | grep -i '^location'

curl 默认不跟随跳转,只打印第一跳的响应头,后面的链路根本没显示出来。中间那两跳多半是 http 到 https 再补 www,每一层都单独发了一次 301。这一点先确认清楚,后面就不用反复试。

「重定向链排查」这类改动最怕改一半,回滚脚本先准备好,再动生产。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

具体做法是,加 -L 让 curl 跟到底,再用 -w 打印每跳的最终地址和跳转次数;用 --max-redirs 限制次数,超过就报错,避免规则写错时一直跟下去;把每一跳的 Location 抄下来按顺序排一遍,看哪一层在重复做同一件事;合并规则时只保留最外层一条,直接跳到最终地址。

改完照着核一遍,同一条链接只剩一跳,跳转次数变成 1,首屏等待时间回到三百毫秒以内。

作者 9823189