在 PHP / cURL 中等待救援重定向 url

Waiting to rescue redirect url in PHP / cURL

我需要从 link 检索重定向 URL,但是当我提取 header 信息时,它只是 returns:

Locations: redirecting...

之后,页面被重定向到URL我要兑换的页面。 我正在使用代码:

$url = 'http://168.0.51.253:8000/boleto/74140-P2UTT5T4IH/';

// Final URL I want to retrieve = https://data.galaxpay.com.br/prooverisp/boleto/202109YB0K77L7WYP5PPY0NGT6DMKOD01155936

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$a = curl_exec($ch);
curl_close($ch);

$headers = explode("\n", $a);
$j = count($headers);
$ticket = null;
for ($i = 0; $i < $j; $i++) {
    if (strpos($headers[$i], "Location:") !== false) {
        $ticket = trim(str_replace("Location:", "", $headers[$i]));
        break;
    }
}

var_dump($headers);

如何等待重定向并检索最终的 URL?我和 PHP.

一起工作

您正在尝试从第一个 link 获取重定向(又名位置)header,但是当您在浏览器中禁用 JavaScript 的情况下打开它时,您会看到是 none。事实上,你总是得到一个响应代码 200 而没有 Location header.

实际上有一个 javascript 可以立即将您重定向到目标 URL:

<!doctype html>
<style type="text/css" media="all">
html, body {
    height: 100%;
    margin: 0;         /* Reset default margin on the body element */
}
iframe {
    display: block;       /* iframes are inline by default */
    border: none;         /* Reset default border */
    width: 100%;
    height: 100%;
}
</style>
Redirecionando... 
<script type="text/javascript">
document.location.href = "XYZ"
</script>

XYZ=目标link你要抢,出于隐私原因,我只是在这里删除它。

你可以这样抢:

$url = 'http://1.2.3.4:8000/foo/bar/'; // URL removed for privacy

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$a = curl_exec($ch);
curl_close($ch);

$lines = explode("\n", $a);
$j = count($lines);
$ticket = null;
for ($i = 0; $i < $j; $i++) {
    if (preg_match('/document.location.href = \"(.*)\"/', $lines[$i], $matches)) {
        $ticket = trim($matches[1]);
        break;
    }
}

var_dump($ticket);

此外,您的数组循环无缘无故地有点复杂,因此您可以使用 foreach:

来简化它
$ticket = null;
foreach (explode("\n", $a) as $line) {
    if (preg_match('/document.location.href = \"(.*)\"/', $line, $matches)) {
        $ticket = trim($matches[1]);
        break;
    }
}