在使用 PHP 的 cURL
库时,如果你希望 cURL
自动跟随重定向(即自动跳转到新的 URL),你可以通过设置 CURLOPT_FOLLOWLOCATION
选项来实现。这个选项会告诉 cURL
在遇到 3xx 状态码(如 301、302 等)时自动跳转到新的 URL。
以下是一个简单的示例,展示了如何使用 cURL
并启用跟随跳转功能:
<?php
// 初始化 cURL 会话
$ch = curl_init();
// 设置要请求的 URL
curl_setopt($ch, CURLOPT_URL, "http://example.com");
// 启用跟随跳转
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// 设置最大跳转次数(可选)
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
// 将响应作为字符串返回,而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 执行 cURL 请求并获取响应
$response = curl_exec($ch);
// 检查是否有错误发生
if (curl_errno($ch)) {
echo 'cURL 错误: ' . curl_error($ch);
} else {
// 输出响应内容
echo $response;
}
// 关闭 cURL 会话
curl_close($ch);
?>
CURLOPT_FOLLOWLOCATION
: 设置为 true
时,cURL
会自动跟随重定向。CURLOPT_MAXREDIRS
: 设置最大跳转次数,防止无限重定向。默认情况下,cURL
会跟随最多 20 次重定向。CURLOPT_RETURNTRANSFER
: 设置为 true
时,cURL
会将响应内容作为字符串返回,而不是直接输出到浏览器。CURLOPT_FOLLOWLOCATION
可能会被禁用,特别是在 open_basedir
或 safe_mode
启用的情况下。如果遇到这种情况,你可能需要手动处理重定向。Location
字段来实现。<?php
function curl_follow_redirect($url, $max_redirects = 10) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$redirect_count = 0;
while ($http_code == 301 || $http_code == 302) {
if ($redirect_count >= $max_redirects) {
break;
}
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
preg_match('/Location: (.*)/i', $header, $matches);
$new_url = trim($matches[1]);
curl_setopt($ch, CURLOPT_URL, $new_url);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$redirect_count++;
}
curl_close($ch);
return $response;
}
$response = curl_follow_redirect("http://example.com");
echo $response;
?>
这个手动处理重定向的函数会在遇到 301 或 302 状态码时,解析响应头中的 Location
字段,并继续请求新的 URL,直到达到最大重定向次数或没有更多的重定向为止。