libcurl默认不自动跟随重定向,必须显式设置curlopt_followlocation为1l并配合curlopt_maxredirs(建议5l或10l)才能安全启用跳转;重定向时cookie和认证头默认不透传,需通过curlopt_cookiejar/curlopt_unrestricted_auth等选项手动处理,且https→http跳转需设置curlopt_redir_protocols允许。

Libcurl默认不自动跟随重定向,必须显式启用
Libcurl默认把301/302响应当作普通响应返回,CURLOPT_FOLLOWLOCATION必须设为1L才开启重定向跳转。不设这个选项,curl_easy_perform返回成功,但HTTP 302被原样返回,业务逻辑容易误判为“请求成功”。
常见错误是只设了CURLOPT_FOLLOWLOCATION,却忘了配CURLOPT_MAXREDIRS——默认最大跳转次数是-1(无限制),可能陷入循环重定向导致hang住或超时。
-
CURLOPT_FOLLOWLOCATION设为1L,否则重定向完全不生效 -
CURLOPT_MAXREDIRS建议设为5L或10L,避免无限跳转 - 若需获取跳转路径链,用
CURLOPT_HEADERFUNCTION捕获Location头,或调用curl_easy_getinfo(curl, CURLINFO_REDIRECT_URL, &url)
重定向后Cookie和认证头不会自动透传,需手动配置
Libcurl默认在重定向时丢弃原始请求的Cookie和Authorization头——这是RFC合规行为,但多数业务场景需要保持会话。不能靠CURLOPT_COOKIEFILE或CURLOPT_HTTPHEADER简单复用,因为重定向是新请求,原始头不继承。
正确做法是启用CURLOPT_COOKIEJAR(配合CURLOPT_COOKIEFILE)让libcurl自动管理Cookie;对于Bearer Token等认证头,得自己用CURLOPT_HEADERFUNCTION解析响应头,再在下一次请求中重新设置CURLOPT_HTTPHEADER。
- Cookie维持:设
CURLOPT_COOKIEFILE为""(空字符串)+CURLOPT_COOKIEJAR为临时文件路径,libcurl自动读写 - 认证头透传:重定向后调用
curl_easy_getinfo(curl, CURLINFO_REDIRECT_URL, &next_url),再重建CURLOPT_HTTPHEADER并curl_easy_setopt(curl, CURLOPT_URL, next_url) - 注意
CURLOPT_UNRESTRICTED_AUTH设为1L,否则跨域重定向时libcurl会主动清空认证头
HTTPS重定向到HTTP会被libcurl拒绝,除非关闭安全检查
从https://a.com重定向到http://b.com时,libcurl默认拒绝跳转,并返回CURLE_ABORTED_BY_CALLBACK或CURLE_SSL_CONNECT_ERROR——这是出于安全考虑,防止降级攻击。但测试环境或内网服务常需允许这类跳转。
关键开关是CURLOPT_REDIR_PROTOCOLS和CURLOPT_PROTOCOLS。仅设CURLOPT_SSL_VERIFYPEER为0L没用,它只影响SSL证书校验,不影响协议切换策略。
- 允许HTTP/HTTPS混跳:设
CURLOPT_REDIR_PROTOCOLS为CURLPROTO_HTTP | CURLPROTO_HTTPS - 若还需支持
ftp://等协议重定向,按需添加对应位掩码,但生产环境应严格限制 -
CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST仍建议保持1L,仅在调试时临时关闭
重定向中间响应体默认不返回,需用CURLOPT_HEADERFUNCTION捕获
启用CURLOPT_FOLLOWLOCATION后,libcurl只返回最终响应体,所有中间302响应的body都被丢弃。如果业务需要检查跳转过程中的响应内容(比如某些API在302响应体里返回token),必须手动拦截。
不能依赖CURLOPT_WRITEFUNCTION,因为它只对最终响应生效。唯一可靠方式是用CURLOPT_HEADERFUNCTION配合自定义回调,在每次收到响应头时判断状态码,再用curl_easy_setopt(curl, CURLOPT_NOBODY, 1L)发HEAD请求单独抓中间响应。
- 注册
CURLOPT_HEADERFUNCTION回调,在回调里检查strncasecmp(header, "HTTP/", 5) == 0识别响应起始,再解析状态行 - 检测到
302时,立即调用curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code)确认 - 如需body,暂停自动跳转,改用
CURLOPT_FOLLOWLOCATION设为0L,自己解析Location头后发起下一次请求
CURLOPT_UNRESTRICTED_AUTH和CURLOPT_REDIR_PROTOCOLS的组合效果——它们不像CURLOPT_FOLLOWLOCATION那样显眼,但一旦缺失,重定向在特定场景下就静默失败。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











