如何使用CURL跟踪所有重定向,包括META-refresh

时间:2017-03-17 14:22:02

标签: php redirect curl refresh meta

我使用API​​返回一组网址,所有网址都有重定向,但有多少重定向以及网址的位置未知。

所以我要做的就是追踪路径并找到最后一个网址。

我基本上想要做同样的事情:http://wheregoes.com/retracer.php,但我只需知道最后一个网址

我已经找到了一种方法来使用CURL,但是当它是元刷新时跟踪会停止。

我已经看过这个帖子:PHP: Can CURL follow meta redirects但它对我帮助不大。

这是我目前的代码:

function trace_url($url){
    $ch = curl_init($url);
    curl_setopt_array($ch, array(
        CURLOPT_FOLLOWLOCATION => TRUE,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_SSL_VERIFYHOST => FALSE,
        CURLOPT_SSL_VERIFYPEER => FALSE,
    ));

    curl_exec($ch);
    $url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
    curl_close($ch);

    return $url;
}

    $lasturl = trace_url('http://myurl.org');

    echo $lasturl;

1 个答案:

答案 0 :(得分:0)

嗯,Header Redirects之间存在很大差异,基本上是3xx级和META刷新,只有一种方式依赖于服务器,另一种方式与客户端相关。

只要curl或已知的cURL或libcurl在服务器中执行,它就可以处理第一种类型,'Header重定向'或http重定向。

因此,您可以使用一堆方法提取网址。

您需要手动处理它。

1)废弃网页内容。

2)从元标记中提取链接。

3)如果你愿意,可以抓住这个新链接。

来自你的例子:

function trace_url($url){
    $ch = curl_init($url);
    curl_setopt_array($ch, array(
        CURLOPT_FOLLOWLOCATION => TRUE,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_SSL_VERIFYHOST => FALSE,
        CURLOPT_SSL_VERIFYPEER => FALSE,
    ));

    curl_exec($ch);
    $url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
    curl_close($ch);

    return $url;
}

$response = trace_url('http://myurl.org');

// quick pattern for explanation purposes only, you may improve it as you like
preg_match('#\<meta.*?content="[0-9]*\;url=([^"]+)"\s*\/\>#', $response, $links);

$newLink = $links[1];

或在您提出的解决方案中提到的问题是使用simplexml_load_file库。

$xml = simplexml_load_file($response);
$link = $xml->xpath("//meta[@http-equiv='refresh']");