curl 高级用法:重定向跟随与自定义主机解析


本文介绍如何使用 curl 跟随 HTTP 重定向,以及如何在请求中自定义目标主机(“加 host”),并结合二者进行调试与测试。




1. 跟随 HTTP 重定向


默认情况下,curl 不会自动跟随服务器返回的 3xx 重定向响应。要启用此功能,需要使用 -L(或 --location)参数。


1.1 基本用法


curl -L <目标URL>

当服务器返回 301、302 等状态码时,curl 会自动向 Location 头指定的新地址发起请求,直到获取到最终内容。


1.2 常用辅助选项







































选项 说明
--max-redirs <数量> 限制最大重定向次数,防止死循环
-i 显示最终响应头
-I 仅显示响应头(不下载正文),配合 -L 可查看重定向链
-v 显示详细通信过程,包括每次重定向的请求/响应
--proto-redir <协议> 限制重定向时允许的协议(如 http,https)
--location-trusted 在重定向时也发送认证信息(如 Cookie)
--post301 / --post302 / --post303 控制重定向后是否继续使用 POST 方法(默认 POST 可能转为 GET)

1.3 实用示例


查看完整重定向链


curl -sIL https://example.com | grep -iE '^HTTP/|^location:'

输出示例:


HTTP/1.1 301 Moved Permanently
Location: https://www.example.com
HTTP/1.1 200 OK

获取最终跳转后的 URL


curl -Ls -o /dev/null -w '%{url_effective}' http://google.com

这条命令会输出最终 URL(例如 http://www.google.com/),常用于脚本中。


1.4 在编程语言中使用(libcurl)




  • C 语言:


    curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 5L); // 可选



  • PHP(使用 cURL 扩展):


    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 5);



1.5 注意事项



  • 请求方法变化:根据 HTTP 规范,curl 在重定向时可能将后续请求方法从 POST 改为 GET(除非使用 --post301 等选项强制保留)。

  • 安全风险:自动跟随可能将请求导向不可信站点,建议设置 --max-redirs 和 --proto-redir 加以限制。




2. 自定义主机解析(“加 host”)


有时我们需要访问特定 IP 但模拟对某个域名的请求,或者将域名强制解析到指定 IP,而不修改系统的 /etc/hosts 文件。curl 提供了两种方式。


2.1 方法一:修改 Host 请求头(-H)


使用 -H 自定义 Host 头,让服务器认为你在访问指定的域名。适用于直接访问 IP 地址的场景。


# 访问 192.168.1.2 这台服务器,但 Host 头设置为 www.example.com
curl -L -H "Host: www.example.com" http://192.168.1.2


  • -L 用于跟随可能的重定向。

  • 如果重定向到其他域名,curl 会使用新域名的真实 IP 和 Host 头发起后续请求(除非使用 --location-trusted 强制继续携带自定义头)。


2.2 方法二:强制 DNS 解析(--resolve)


--resolve 可以覆盖 curl 的 DNS 解析,将指定域名和端口映射到特定 IP,且对后续所有重定向均有效(只要匹配相同的域名和端口)。


# 访问 example.com 时,强制将 443 端口解析到 127.0.0.1
curl -L --resolve example.com:443:127.0.0.1 https://example.com


  • 格式:--resolve <host>:<port>:<ip>

  • 可多次使用为不同域名指定解析。

  • 对于 HTTPS,该方式也能正确处理 SNI(Server Name Indication),比仅修改 Host 头更可靠。


2.3 两种方法的对比与选择






















方式 适用场景 特点
-H "Host: ..." 直接访问 IP,模拟域名 仅影响 HTTP 请求头,不修改 DNS,HTTPS 下 SNI 可能不匹配
--resolve 将域名强制指向 IP 修改 DNS 解析,HTTPS SNI 自动匹配,重定向后继续生效

建议:处理 HTTPS 时优先使用 --resolve;仅测试 HTTP 头或临时访问 IP 时可用 -H。


2.4 组合使用示例


访问内网 IP,同时跟随重定向并保持 Host 头


curl -L -H "Host: test.internal" http://10.0.0.1

将生产域名解析到测试服务器,并跟随重定向


curl -L --resolve api.example.com:443:192.168.1.100 https://api.example.com/v1/data

2.5 在编程语言中实现



  • C 语言:

    • 自定义 Host 头:使用 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers)。

    • 强制解析:使用 curl_easy_setopt(curl, CURLOPT_RESOLVE, resolve_list)。


  • PHP:

    • 自定义头:curl_setopt($ch, CURLOPT_HTTPHEADER, ['Host: example.com'])。

    • 强制解析(PHP 7.0.7+):curl_setopt($ch, CURLOPT_RESOLVE, ['example.com:443:127.0.0.1'])。





3. 综合调试示例


结合所有知识点,一条完整的调试命令可能如下:


# 强制将 example.com 解析到本地测试机,并跟随重定向,显示详细过程
curl -L -v --resolve example.com:443:127.0.0.1 https://example.com/api/test

若想查看重定向链及最终响应头,可改用:


curl -sIL --resolve example.com:443:127.0.0.1 https://example.com



4. 总结



  • 跟随重定向:务必加上 -L,并可配合 --max-redirs、--location-trusted 等精细控制。

  • 自定义主机:

    • 访问 IP 模拟域名:用 -H "Host: ..."。

    • 域名强制解析到 IP:用 --resolve(推荐用于 HTTPS)。


  • 二者结合:可根据需要同时使用,例如在测试环境中模拟线上域名并跟随跳转。


掌握这些技巧,能大大提升您使用 curl 进行接口调试、网络测试和安全排查的效率。