如何使用 cURL 跟随 HTTP 重定向

当您需要获取实际页面内容时,cURL 跟随重定向方法变得非常有用。通过使用 curl -L <URL> 命令,而不是单独的 curl <URL>,您可以确保访问最终页面并从这里抓取数据。在其他情况下,网站可能会将您重定向到特定位置的页面,或它决定的任何其他页面。在这里,您将了解如何使用它以及如何调试潜在问题。

结合 CyberYozh proxies,您可以获得工具集,从任何页面获取内容而不受限制或不必要的重定向。 

ℹ️

当您需要快速自动执行 HTTP 请求时,cURL 极其有用。阅读 如何使用 cURL 对网站进行身份验证 以获取更多信息。

工具:选择什么代理

重定向链通常通过地理特定或 CDN 端点路由,因此 cURL 请求背后的代理决定了您是否能到达正确的最终页面或在链中被阻止。 

住宅轮换代理应该是您的默认选择:它们的 IP 轮换易于按请求或按会话控制,这对于 网页抓取 数据收集 工作流程至关重要,其中每个重定向跳转都需要干净、可信的 IP。

代理类型

重定向密集型任务的用途

住宅轮换代理

首选默认:可控轮换,多跳链上的低阻止率

移动 LTE/5G 代理

最适合需要运营商级信任的登录/地理限制重定向

住宅 ISP 代理

需要会话持久性的重定向链的稳定静态 IP

数据中心代理

最快,但对基于重定向的机器人检查最弱

流程:使用 cURL 跟随重定向命令

您的基本命令是:

bash
curl -L <URL>

它将目标 URL 设置为最终目的地,即使网站将您重定向到另一个 URL(例如特定位置的页面),也必须到达该目的地。要与代理一起使用,您需要稍作修改,添加 -x (或 --proxy)命令以及协议(HTTP 或 SOCKS5; 阅读更多关于代理协议选择的信息)和代理凭据。

bash
curl -L -x <protocol://user:password@IP:port> <URL>
⚙️

使用 轮换代理,您将获得一个带有凭据的网关,可在控制面板中访问:只需将其放入命令中,并在那里设置轮换即可。

使用基本重定向与 curl -L

添加 -L 到任何 cURL 请求,使其自动跟随每个 3xx Location 头,直到到达最终响应。

bash
curl -L <URL>

没有 -L,cURL 会在第一次重定向时停止,仅返回中间响应。

使用 --max-redirs 设置限制

限制 cURL 将跟随的跳转次数,以防止它在循环或过长的链中挂起。

bash
curl -L --max-redirs 5 <URL>

对于预期较短的链,将其设置为较低值(2–5),仅对已知的多步骤流程(如登录或 CDN 路由)设置更高值。

⚙️

遵守速率限制和网站的 robots.txt 极为重要。阅读关于 道德网页抓取 以了解更多信息。

使用 curl -L -v 查看重定向序列

添加 -v (详细模式)以打印每个请求和响应头,包括链中的每个 Location 跳转。

bash
curl -L -v <URL>

当重定向链行为异常,且您需要准确识别其分歧位置时,请使用此方法。

使用 curl -L -I 检查重定向页面

结合 -I (仅头部)与 -L 来跟踪完整的重定向链,而无需下载页面主体。

bash
curl -L -I <URL>

这是在运行完整抓取之前确认最终目标 URL 和状态码的最快方法。

使用 curl -A 发送自定义 user-agent

设置一个真实的 user-agent 字符串,以便与设备或浏览器检测相关的重定向逻辑能够正确解析。

bash
curl -L -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" <URL>
📡

阅读 如何部署随机 user-agent 来帮助你保护抓取管道并避免限制。

调试:常见问题排查

如果遇到任何问题,不用担心。大多数问题都很容易解决。在这里,我们将探讨最常见的问题以及如何解决它们。

HTTP 302 和其他响应代码

在使用 cURL 重定向时,你经常会遇到 HTTP 3xx 代码,每个代码对于是否保留请求方法和主体都有不同的规则。这时你需要在使用 GETPOST 方法之间切换

ℹ️

这两种方法都可以通过在 URL 前指定来轻松使用 curl 函数。 GET 在大多数选项中默认使用,要使用 POST,你需要在 URL 前显式写入 POST。

301 Moved Permanently

资源有一个新的永久 URL;某些客户端在跟随时会将 POST 切换为 GET。正常使用 -L;将新 URL 视为未来请求的规范地址。

302 Found

一个传统的临时重定向;不同客户端对方法保留的行为不一致,因此 cURL 可能会将 POST 转换为 GET。这是最常见的问题。如果需要保留原始方法,请显式使用 --post302 进行测试。

303 See Other

始终重定向到 GET 请求,通常在表单提交或 API 操作完成后。预期主体数据会被丢弃;如果需要重新发送原始负载,不要仅依赖 -L

307 Temporary Redirect

保留原始方法和主体,因此 POST 仍然是 POST。在抓取提交后重定向的 API 端点时,可以安全地使用 -L 跟随。

308 Permanent Redirect

与 301 相同,但保证方法不会改变。将其视为永久移动的现代、方法安全的等效形式。

cURL 不跟随重定向

如果 curl -L 似乎没有效果,该网站可能使用的是 JavaScript 或 meta-refresh 重定向,cURL 无法检测到,因为它只读取 HTTP 头。 

首先使用 curl -L -I 确认。如果状态保持为 200,则重定向逻辑是客户端的,需要使用 无头浏览器

⚙️

查看 PlaywrightPuppeteer 指南,了解更多关于高级网页自动化和抓取的信息。

cURL 47 maximum redirects followed 错误

此错误表示 cURL 达到了 --max-redirs 限制(默认值很高,但循环会快速触发)。解决方法:

  1. 运行 curl -L -v 来检查链并检测循环。

  2. 在调试期间降低 --max-redirs

  3. 切换到干净的、轮换的住宅代理 IP。许多重定向循环是由被列入黑名单或重复使用的数据中心 IP 被反机器人系统拒绝而触发的。

结论:使用 cURL 跟随重定向

cURL 重定向命令让您到达真正的最终页面,而不是停留在中间跳转,使用 -L 来跟随,使用 --max-redirs 来避免循环。配合 CyberYozh 住宅或移动代理,您可以大规模地持续、无阻碍地访问重定向密集的网站。

立即查看 代理目录 开始使用。

关于 cURL 跟随重定向的常见问题

如何让 cURL 跟随重定向?

在命令中添加 -L (或 --location)标志。然后 cURL 将读取每个 Location 头并自动请求下一个 URL,直到到达最终页面。

为什么 curl -L 在某些网站上不起作用?

重定向可能基于 JavaScript 或 meta-refresh,而非 HTTP 3xx 响应,cURL 无法检测到这类重定向,因为它只处理响应头。

cURL 默认跟随多少次重定向?

cURL 默认跟随较多次跳转,但可以通过 --max-redirs更改,这也能防止无限循环。

"curl: (47) maximum redirects followed" 是什么意思?

这意味着 cURL 达到了重定向限制,通常是由于循环或网站反复拒绝请求,往往由被标记的 IP 触发。

如何同时使用 cURL 代理并跟随重定向?

-L-x protocol://user:password@IP:port结合使用;cURL 会通过该代理路由重定向链的每一跳。

cURL 会自动跟随 302 重定向吗?

仅在启用 -L 时才会;否则,cURL 会在第一个 302 响应处停止,不会请求新 URL。

如何阻止 cURL 跟随重定向?

只需省略 -L,或设置 --max-redirs 0,以确认该标志未在其他地方意外设置。

重定向会将我的请求从 POST 改为 GET 吗?

这取决于状态码:301/302 在某些客户端可能会切换为 GET,而 307/308 始终保留原始方法和请求体。

如何在不获取页面主体的情况下查看完整的重定向链?

使用 curl -L -I 仅打印每一跳的响应头和状态码,快速显示最终目标地址。

哪种代理类型最适合重定向密集型抓取?

默认推荐住宅轮换代理,因为它们结合了可控的 IP 轮换和在重定向及反机器人检查中的高接受率。