如何使用PHP获取网站的最终,重定向,规范URL?

时间:2011-12-01 08:04:13

标签: php redirect url-shortener canonical-link

在链接缩短程序和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持开放态度,但更喜欢在我自己的服务器上运行的东西。

3 个答案:

答案 0 :(得分:12)

由于我无法找到任何真正符合我要求的库,而且我希望做的不仅仅是关注HTTP重定向,我还是继续创建了一个库来完成目标并发布它根据MIT许可证。你可以在这里得到它:

https://github.com/mattwright/URLResolver.php

URLResolver.php是一个PHP类,它尝试将URL解析为最终的规范链接:

  • 遵循HTTP标头中的301和302重定向
  • 关注Open Graph URL< meta>在网页中找到的标签< head>
  • 关注规范网址< link>在网页中找到的标签< head>
  • 如果内容类型不是HTML页面,则快速中止下载

我当然不是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' );

如果您想进一步修改或帮助实现这一目标,请与我们联系。