有效,但必须同时设置curlopt_followlocation为false且curlopt_maxredirs为0,并通过curlinfo_http_code为3xx、curlinfo_redirect_count为0验证拦截成功。

curl_setopt 禁用重定向真的有效吗
有效,但必须配对使用两个关键选项:CURLOPT_FOLLOWLOCATION 设为 false,同时清除 CURLOPT_MAXREDIRS 的副作用影响。只关 FOLLOWLOCATION 不够稳妥,某些 PHP+cURL 组合(尤其是旧版本或启用了 open_basedir 时)仍可能因底层行为异常触发重定向。
CURLOPT_FOLLOWLOCATION = false 是基础,但还不够
这是禁用重定向的首要操作,但它本身不阻止 cURL 尝试解析 Location 头 —— 只是不自动发起新请求。实际中需配合以下设置:
-
CURLOPT_FOLLOWLOCATION必须显式设为false(注意:不能写成0或'false',布尔值要严格) -
CURLOPT_MAXREDIRS建议设为0,避免某些 cURL 版本在FOLLOWLOCATION=false下仍检查该值并报错 - 如果启用了
open_basedir,CURLOPT_FOLLOWLOCATION会被强制禁用且不可绕过 —— 此时即使设为true也无效,但你设false是安全冗余
如何确认重定向确实被拦住了
不能只看返回内容是否变化,要检查响应头和返回码:
- 启用
CURLOPT_HEADER或CURLOPT_NOBODY+CURLOPT_RETURNTRANSFER捕获原始响应头 - 用
curl_getinfo($ch, CURLINFO_HTTP_CODE)获取状态码:若为301、302、307等,说明服务器发了重定向指令,而你的请求没跟过去 —— 这才是成功拦截 - 用
curl_getinfo($ch, CURLINFO_REDIRECT_COUNT)验证:应始终为0
示例关键片段:
立即学习“PHP免费学习笔记(深入)”;
$ch = curl_init('https://example.com/redirects');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_MAXREDIRS, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 得到 302 才对
$redirect_count = curl_getinfo($ch, CURLINFO_REDIRECT_COUNT); // 必须是 0
禁用后怎么处理 Location 头
cURL 不跳转,但 Location 响应头仍在返回体里,你需要手动提取:
- 用
explode("\r\n\r\n", $response, 2)分离 header 和 body - 用正则或
preg_match('/^Location:\s*(.*)$/mi', $headers, $matches)提取跳转地址 - 注意:HTTP/2 响应头格式不同,
CURLOPT_HEADER在 HTTP/2 下可能不返回传统文本头,此时建议改用CURLOPT_HEADERFUNCTION回调捕获
别忘了检查 Location 值是否为绝对 URL;相对路径需自行拼接 base URL,PHP 不会帮你做这事。











