php从源url获取重定向的url

Posted

技术标签:

【中文标题】php从源url获取重定向的url【英文标题】:php get url of redirect from source url 【发布时间】:2013-07-02 13:54:46 【问题描述】:

我有这个链接:

http://libero-news.it.feedsportal.com/c/34068/f/618095/s/2e34796f/l/0L0Sliberoquotidiano0Bit0Cnews0C12735670CI0Esaggi0Eper0Ele0Eriforme0Ecostituzionali0EChiaccherano0Ee0Eascoltano0Bhtml/story01.htm

如果你访问它,它会变成:

http://www.liberoquotidiano.it/news/1273567/I-saggi-per-le-riforme-costituzionali-Chiaccherano-e-ascoltano.html

如何从第一个链接获取第二个链接?

我已经尝试过了,但没有用,返回相同的第一个链接:

<?php
$url="http://libero-news.it.feedsportal.com/c/34068/f/618095/s/2e34796f/l/0L0Sliberoquotidiano0Bit0Cnews0C12735670CI0Esaggi0Eper0Ele0Eriforme0Ecostituzionali0EChiaccherano0Ee0Eascoltano0Bhtml/story01.htm";
$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);
print_r($a);echo"<br>";
if(preg_match('#Location: (.*)#', $a, $r))
   $l = trim($r[1]);
   echo $l;
else echo "not working";

非常感谢。

【问题讨论】:

代码里清楚了吗? curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 对不起,我检查了源代码。浏览器使用 javascript 重定向。因此,您必须阅读 html/js 代码,解析它,获取 url,然后从该 url 获取内容... 【参考方案1】:

感谢@king-isaac,以下代码已经过测试并且可以正常工作。

<?php 

$url="http://libero-news.it.feedsportal.com/c/34068/f/618095/s/2e34796f/l/0L0Sliberoquotidiano0Bit0Cnews0C12735670CI0Esaggi0Eper0Ele0Eriforme0Ecostituzionali0EChiaccherano0Ee0Eascoltano0Bhtml/story01.htm";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Must be set to true so that PHP follows any "Location:" header
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$a = curl_exec($ch); // $a will contain all headers

$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); // This is what you need, it will return you the last effective URL

// Uncomment to see all headers
/*
echo "<pre>";
print_r($a);echo"<br>";
echo "</pre>";
*/

echo $url; // Voila
?>

【讨论】:

很好的解决方案,可以添加对cokies的支持吗?见this DOI redirector,返回secure.jbs.elsevierhealth.com/action/cookieAbsent 如果不想下载多余的千字节,最好加上 curl_setopt($ch, CURLOPT_NOBODY, true);不幸的是,这不会从第二个请求中保存,因此最好手动解析标头【参考方案2】:

您可以在不使用 CURL 的情况下做到这一点。让它变得简单而简短。

<?php
$url="http://libero-news.it.feedsportal.com/c/34068/f/618095/s/2e34796f/l/0L0Sliberoquotidiano0Bit0Cnews0C12735670CI0Esaggi0Eper0Ele0Eriforme0Ecostituzionali0EChiaccherano0Ee0Eascoltano0Bhtml/story01.htm";

$headers = @get_headers($url);
$final_url = "";
foreach ($headers as $h)

    if (substr($h,0,10) == 'Location: ')
    
    $final_url = trim(substr($h,10));
    break;
    

echo $final_url;
?>

【讨论】:

您不需要使用 foreach,get_headers 方法有一个参数(格式),当非零时,将数组键作为标题值,因此您可以执行以下操作:@ 987654323@echo $headers['Location'];在这里查看更多php.net/manual/en/function.get-headers.php【参考方案3】:

您可以使用curl_getinfo 获取请求的最终 URL。

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

【讨论】:

这个不能用在这个例子中,链接的第一次点击只包含一个广告和一个指向第二个链接的链接。它不是标头重定向。只有当用户单击它一次并且有一个 cookie 时,它​​才会变成一个标题重定向,我假设...... 错误:PHP Warning: curl_setopt() expects parameter 1 to be resource, string【参考方案4】:

如果你想获得第一个重定向:

function getRedirect($url)
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36');
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $responseHeaders = curl_exec($ch);
    curl_close($ch);
    if(preg_match_all("/^location: (.*?)$/im", $responseHeaders, $results))
        return $results[1][0];

【讨论】:

以上是关于php从源url获取重定向的url的主要内容,如果未能解决你的问题,请参考以下文章

PHP获取重定向URL的几种方法

php 获取PHP中URL的HTTP重定向目标

php 获取PHP中URL的HTTP重定向目标

使用curl获取Location:重定向后url

从源“null”访问 Twitter_OAuth_Url(从“http://localhost:3000/api/twitter-login”重定向)的 XMLHttpRequest 已被阻止

如何用 PHP 实现 302 重定向到其他 URL