在 PHP 中使用 CURL multi execute with follow location 时是否可以获取原点 URL?

Is it possible to get the origin URL when using a CURL multi execute in PHP with follow location?

我们正在制作一个脚本,用于检查我们系统中的 link 是否存在无效状态代码。例如,有人在我们的网站上创建了一个页面,用 link 填充了它,但是多年后,某些 url 不正确(4xx/5xx 状态代码)。

请检查 link 是否有效,我制作了一个 curl 片段来获取状态代码。由于link的数量,我使用curl_multi_exec到运行异步。

但是,现在我遇到了一个问题。如果 url 的状态码为 3xx,则表示存在重定向。在这种情况下,我必须遵循 "real" url 并获取该状态代码。 PHP 有一个 curl 选项:CURLOPT_FOLLOWLOCATION.

问题是:当有重定向时,服务器 returns 正确的状态码,错误的 URL。我们必须用 "destination" URL.

的状态代码更新 "origin" URL 的状态代码

例如: 假设 http://example.com 重定向到 https://example.com 在这种情况下,我们会收到 https://example.com 的状态码,但我们必须在 http://example.com.[=18 的记录中更新该状态码=]

这是我制作的片段:

// CURL Options
$options = array(
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER         => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_ENCODING       => "",
    CURLOPT_AUTOREFERER    => true,
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_TIMEOUT        => 10,
    CURLOPT_NOBODY         => true
);

// Init CURL Multi
$mh = curl_multi_init();

添加一个URL:

$ch = curl_init(trim($RowFromDatabase->Url));
curl_setopt_array($ch, $options);
curl_multi_add_handle($mh, $ch);

这里是我 运行 所有检查的地方:

do {
    // Run all URL's
    while(($exec = curl_multi_exec($mh, $running)) == CURLM_CALL_MULTI_PERFORM);
    if($exec != CURLM_OK) {
        break;
    }

    // Get info about URL's
    while($ch = curl_multi_info_read($mh)) {
        $ch = $ch['handle'];

        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $info = curl_getinfo($ch);

        // URL (this is the destination URL, I would like to get the origin URL here)
        $url = $info['url'];

        $broken = false;

        if($httpCode >= 400){
            $broken = true;
        }

        if($broken){
            // Update broken in database
            $QueryBroken->bind_param("s",$url);
            $QueryBroken->execute();
        }

        // Handle
        curl_multi_remove_handle($mh, $ch);
        curl_close($ch);                
    }
} while($running);
curl_multi_close($mh);

所以,基本上:我想接收起点 url 而不是目的地 url。这可能吗?

您需要使用 CURLOPT_RETURNTRANSFER 要求 CURL return headers 并自行查找重定向指令。此处对此进行了描述:

http://zzz.rezo.net/HowTo-Expand-Short-URLs.html