我使用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;
答案 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']");