curl --max-redirs是什么
curl 是一个功能强大的命令行 HTTP 客户端,默认会自动跟随 HTTP 重定向。用 -L 参数启用跟随重定向后,curl 会一直跟随服务器返回的 301、302、303、307、308 等重定向响应,直到到达最终目标或者达到某个上限。
这个上限就是由 --max-redirs 参数控制的。它告诉 curl:在跟随重定向的过程中,最多允许跳转几次。超过这个次数还没到达最终目标的话,curl 就会停下来并报错:
curl: Maximum (50) redirects followed
这个限制不是摆设。实际工作中,重定向链可能因为配置错误变成死循环,比如 A 重定向到 B、B 重定向到 A,或者重定向链路过长。如果不设限制,curl 可能跑满连接数、耗尽资源,甚至把服务器打挂。
默认值是多少
curl 的默认 max-redirs 是 50。也就是说,如果不指定这个参数,curl 在启用 -L 的情况下最多跟随 50 次重定向。
这个值对大多数正常网站来说是够用的。但如果遇到以下情况,默认值可能不够:
- 多层反向代理架构,每层都做一次重定向
- URL 短链服务,重定向链本身就很长
- 调试 CDN 多层跳转时的完整链路
- 某些长链路分页或追踪参数拼接场景
基本语法
curl -L --max-redirs N url
# 或者简写
curl -L -m N url
N 是最大跟随次数,必须是整数。设为 0 表示不跟随任何重定向。
常用配置场景
场景1:跟随5次重定向
curl -L --max-redirs 5 https://example.com/short-url
这是最常用的场景。限制 5 次足够覆盖大多数正常的重定向链,如果超过 5 次还没到达最终 URL,说明很可能存在问题。
场景2:完全不跟随重定向
curl -L --max-redirs 0 https://example.com/redirect
虽然加了 -L,但把 max-redirs 设为 0,curl 就会停在第一次重定向响应,返回 301/302 状态码和 Location 响应头,不继续跳转。这在调试时很有用——你想看中间发生了哪些跳转,而不是直接跑到终点。
场景3:跟随20次重定向(长链场景)
curl -L --max-redirs 20 https://example.com/long-chain
对于多层代理或 CDN 回源链路比较长的场景,需要适当放大这个值。但不建议设太大,因为链路越长出问题的概率越高。
场景4:限制跳转次数同时只查看响应头
curl -L --max-redirs 5 -I https://example.com/redirect
用 -I 只获取响应头,配合 max-redirs 可以快速查看重定向链上每一跳的响应头信息,而不需要下载完整页面内容。
实战:追踪完整重定向链路
一个常见的调试需求是:我想知道从原始 URL 到最终目标,一共经历了几次重定向,每次的 Location 是什么。
配合 -v(详细输出)可以做到:
curl -L --max-redirs 50 -v https://example.com/short 2>&1 | grep -E '(< HTTP|< Location|> Host)'
但更精确的做法是用 -w 参数输出重定向次数:
curl -L --max-redirs 50 -w '%{num_redirects}' https://example.com/short
输出的是一个数字,表示 curl 实际跟随了多少次重定向。如果这个数字接近你设定的 max-redirs 上限,说明链路可能偏长,值得关注。
结合其他参数使用
带上Cookie跟随重定向
curl -L --max-redirs 10 -b cookies.txt -c cookies.txt https://example.com/
重定向过程中 Cookie 可能会被设置或更新,用 -b 和 -c 保持 Cookie 状态很重要,尤其是涉及 Session 的场景。
指定最终目标的Host
curl -L --max-redirs 10 --resolve 'final.example.com:443:127.0.0.1' https://example.com/redirect
这个组合不常见,但在调试内网环境时很有用——原始域名走公网重定向,但最终目标指向本地测试服务器。
PowerShell中的等价写法
Windows PowerShell 没有原生 curl 别名(PowerShell 7+ 的 curl 是 curl.exe 的 alias),但参数用法是一样的:
# PowerShell 7+ (curl.exe)
curl.exe -L --max-redirs 5 https://example.com/redirect
# PowerShell 5.1 (Invoke-WebRequest 不支持-L参数,需用curl.exe)
# 同样的效果
curl.exe -L --max-redirs 5 https://example.com/redirect
如果需要把重定向次数记录到变量中:
$result = curl.exe -L --max-redirs 5 -w '%{num_redirects}' https://example.com/redirect
Write-Host "跟随了 $($result) 次重定向"
常见报错与排查
报错:curl: Maximum (50) redirects followed
这是最常见的报错。说明重定向链路超过了 curl 默认的 50 次上限,或者你设置的 max-redirs 值不够用。
排查方向:
- 用
--max-redirs 0 -L停在第一次重定向,查看Location响应头 - 检查是否有循环重定向(A→B→A 或 A→A)
- 检查 CDN 或网关层的重定向配置
- 适当调大
max-redirs再次尝试,看最终能否到达
不报错但结果不对
有时候链路太长,但 curl 没报错,返回了一个中间页面的内容——不是你想要的最终页面。
这种情况可以用 -w '%{url_effective}' 打印最终到达的 URL 来确认:
curl -L --max-redirs 5 -w '最终URL: %{url_effective}' https://example.com/short
如果最终 URL 不是预期目标,说明中间某跳出了问题。
什么情况下需要调大或调小
调小的场景:
- 只需要确认 URL 是否会重定向,不需要看最终内容
- 防止意外的长链路消耗资源
- 自动化脚本中限制超时行为
调大的场景:
- 多层 CDN 回源(可能涉及 10+ 层跳转)
- 短链服务本身重定向链就长
- OAuth 回调流程中的多次重定向
- 调试完整重定向链路时需要看到每一步
总结
--max-redirs 是 curl 跟随重定向的安全阀。默认值 50 对大多数场景够用,但遇到多层架构、长链路或短链服务时,需要根据实际情况调整。
几个关键点:
- 设为
0可停在第一次重定向,用于调试 - 结合
-w '%{num_redirects}'可以量化重定向次数 - 结合
-w '%{url_effective}'可以确认最终 URL - PowerShell 中注意区分 curl.exe 和 Invoke-WebRequest 的行为差异
相关阅读:
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论