插件窝 干货文章 php curl怎么使用跟随跳转

php curl怎么使用跟随跳转

cURL CURLOPT 定向 response 378    来源:    2025-03-18

在使用 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);
?>

关键点解释:

  1. CURLOPT_FOLLOWLOCATION: 设置为 true 时,cURL 会自动跟随重定向。
  2. CURLOPT_MAXREDIRS: 设置最大跳转次数,防止无限重定向。默认情况下,cURL 会跟随最多 20 次重定向。
  3. CURLOPT_RETURNTRANSFER: 设置为 true 时,cURL 会将响应内容作为字符串返回,而不是直接输出到浏览器。

注意事项:

  • 在某些 PHP 配置中,CURLOPT_FOLLOWLOCATION 可能会被禁用,特别是在 open_basedirsafe_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,直到达到最大重定向次数或没有更多的重定向为止。