使用Curl PHP获取最终重定向

3
我需要从以下链接获取最终重定向的URL:https://web.archive.org/web/20070701005218/http://www.maladnews.com/ 实际上会被重定向到这个链接:https://web.archive.org/web/20080109064420/http://www.maladnews.com/Site%203/Malad%20City%20&%20Oneida%20County%20News/Malad%20City%20&%20Oneida%20County%20News.html 我尝试了其他stackoverflow答案中的方法,但对于上述链接无效。
我已经尝试提取常规位置头:
if(preg_match('#Location: (.*)#', $html, $m))
 $l = trim($m[1]);

我也检查了JavaScript的方式:

preg_match("/window\.location\.replace\('(.*?)'\)/", $html, $m) ? $m[1] : null;

Please help!

1个回答

11

根据您的用例,使用CURLINFO_REDIRECT_URLCURLINFO_EFFECTIVE_URLcurl_getinfo()一起使用。

CURLINFO_REDIRECT_URL - 当CURLOPT_FOLLOWLOCATION选项禁用时:在最后一个事务中找到的重定向URL,需要手动请求下一个。当CURLOPT_FOLLOWLOCATION选项启用时:为空。在此情况下的重定向URL可在CURLINFO_EFFECTIVE_URL中获得。

--来自http://php.net/manual/en/function.curl-getinfo.php

示例:

<?php
$url = 'https://google.com/';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

$html = curl_exec($ch);

$redirectedUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

curl_close($ch);

echo "Original URL:   " . $url . "\n";
echo "Redirected URL: " . $redirectedUrl . "\n";

当我运行这段代码时,输出结果为:

Original URL:   https://google.com/
Redirected URL: https://www.google.com/

我之前尝试过,现在又在这里尝试了一遍,但由于某种原因它输出了初始URL...你能否修改代码使其正常工作? - Acidon
感谢您指出,但我正在测试的URL是有效的,因为它是我在curl上运行的URL(也在问题描述中提到)。此外,我已经尝试了不同的getinfo调用位置,但仍然返回相同的结果...看起来重定向是通过JavaScript或一些刷新元标记在初始页面加载后几秒钟完成的,而curl不会跟随该页面。请检查问题中提供的链接。 - Acidon
我所指的无效网址是这里,绝对不正确。它在域名中有一堆点、点、点。另外,curl不解析任何JavaScript。你只能使用curl来跟随HTTP级别的重定向。我将更新我的代码,提供一个可工作的仅使用curl的示例,以说明HTTP重定向功能。 - Asaph
我明白了,其实 https://w...content-available-to-author-only...e.org/web/20070701005218/http://w...content-available-to-author-only...s.com/ 是该网站(http://ideone.com/)在 php 脚本中掩盖 URL 的方式,仅供帖子作者使用,但不影响脚本工作(您可以通过 fork/edit 重新运行它)。该网站只是一个 PHP 沙箱。如果您的示例无法针对问题描述中的 URL 工作,则无法接受它。正如问题所述,我之前尝试过不同的解决方案,包括您提供的解决方案,但我正在寻找适用于特定 URL 的解决方案。 - Acidon
好的,别管ideone.com和它混乱的URL。如果你在问题中直接包含示例代码,而不是在评论中埋藏一个链接到ideone.com,你可能会更快地得到StackOverflow上的答案。无论如何,我已经在我的回答中包含了一个可工作的示例。请运行它并验证它是否有效。 - Asaph
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接