在链接缩短程序和Ajax的时代,可能有许多链接最终指向相同的内容。我想知道什么是最好的方法来获得PHP的网站的最终,最好的链接,希望有一个库。我无法在Google或GitHub上找到任何内容。
我已经看过这个示例代码,但它不处理像rel =“canonical”元标记或默认ssl端口之类的东西:http://w-shadow.com/blog/2008/07/05/how-to-get-redirect-url-in-php/
Facebook似乎处理得很好,你可以看到他们如何遵循301和rel =“canonical”等。要查看Facebook处理它的方式的示例,请使用他们的Open Graph工具:
https://developers.facebook.com/tools/debug
并输入以下链接:
http://dlvr.it/xxb0W
https://twitter.com/#!/twitter/statuses/136946408275193856
是否有一个已经预先构建的PHP库,它会检查这些头文件,解析301重定向,解析rel =“canonical”,检测重定向循环并正确抓取最佳结果URL以便使用?
作为替代方案,我对可以使用的API持开放态度,但更喜欢在我自己的服务器上运行的东西。
答案 0 :(得分:12)
由于我无法找到任何真正符合我要求的库,而且我希望做的不仅仅是关注HTTP重定向,我还是继续创建了一个库来完成目标并发布它根据MIT许可证。你可以在这里得到它:
https://github.com/mattwright/URLResolver.php
URLResolver.php是一个PHP类,它尝试将URL解析为最终的规范链接:
我当然不是HTTP重定向规则的专家,所以如果有人就如何改进这个库提出建议,我们将不胜感激。我已经测试了数以千计的URL,它似乎做得很好。我遵循了Mario的建议,并在需要时使用了PHP Simple HTML Parser库。
答案 1 :(得分:2)
使用Guzzle(一个众所周知且强大的HTTP客户端),您可以这样做:
<?php
use Guzzle\Http\Client as GuzzleClient;
use Guzzle\Plugin\History\HistoryPlugin;
public function resolveUrl($url)
{
$client = new GuzzleClient($url);
$history = new HistoryPlugin();
$client->addSubscriber($history);
$response = $client->head($url)->send();
if (!$response->isSuccessful()) {
throw new \Exception(sprintf("Url %s is not a valid URL or website is down.", $url));
}
return $response->getEffectiveUrl();
}
答案 2 :(得分:0)
我给你写了一个小功能。这很简单,但它可能是你的起点。注意:http://dlvr.it/xxb0W url会返回其位置响应标头的无效网址。
您需要Altumo PHP库才能使用它。这是我写的一个库,但它是MIT许可证,就像这个函数一样。
请参阅:https://github.com/homer6/altumo
此外,您必须将该函数包装在try / catch中。
/**
* Gets the final URL of a URL that will be redirected.
*
* @param string $url_string
* @throws \Exception //on error
* @return string
*/
function get_final_url( $url_string ){
while( 1 ){
//validate URL
$url = new \Altumo\String\Url( $url_string );
//get the Location response header of the URL
$client = new \Altumo\Http\OutgoingHttpRequest( $url_string );
$response = $client->sendAndGetResponseMessage();
$location = $response->getHeader( 'Location' );
//return the URL if no Location header was found, else continue
if( is_null($location) ){
return $url_string;
}else{
$url_string = $location;
}
}
}
echo get_final_url( 'your url here' );
如果您想进一步修改或帮助实现这一目标,请与我们联系。