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

如何使用PHP获得最终的、重定向的、规范的网站URL?,php,redirect,url-shortener,canonical-link,Php,Redirect,Url Shortener,Canonical Link,在使用链接缩短器和Ajax的时代,可能有许多链接最终指向相同的内容。我想知道最好的方法是用PHP获得最终的、最好的网站链接,最好是使用一个库。我在谷歌或GitHub上找不到任何东西 我已经看过这个示例代码,但它不处理rel=“canonical”元标记或默认ssl端口之类的事情: Facebook似乎处理得很好,你可以看到他们是如何遵循301和rel=“canonical”等的。要查看Facebook处理方式的示例,请使用他们的Open Graph工具: 并输入以下链接: http://dlv

在使用链接缩短器和Ajax的时代,可能有许多链接最终指向相同的内容。我想知道最好的方法是用PHP获得最终的、最好的网站链接,最好是使用一个库。我在谷歌或GitHub上找不到任何东西

我已经看过这个示例代码,但它不处理rel=“canonical”元标记或默认ssl端口之类的事情:

Facebook似乎处理得很好,你可以看到他们是如何遵循301和rel=“canonical”等的。要查看Facebook处理方式的示例,请使用他们的Open Graph工具:

并输入以下链接:

http://dlvr.it/xxb0W
https://twitter.com/#!/twitter/statuses/136946408275193856

是否有一个PHP库已经预先构建了这个库,它将检查这些头,解析301重定向,解析rel=“canonical”,检测重定向循环,并正确地获取要使用的最佳结果URL


作为替代方案,我对可以使用的API持开放态度,但更喜欢在我自己的服务器上运行的API。

我为您编写了一个小函数。这很简单,但它可能是你的一个起点。注:该http://dlvr.it/xxb0W url为其位置响应头返回无效的url

您需要AltumoPHP库才能让它工作。这是我写的一个库,但它是MIT许可证,这个函数也是

见:

此外,还必须将函数包装为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' );

请告诉我您是否需要进一步修改或帮助它运行。

由于我找不到任何真正符合我所寻找的功能的库,并且我希望做的不仅仅是遵循HTTP重定向,我已经着手创建了一个实现目标的库,并在MIT许可下发布了它。你可以在这里找到它:

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

  • 遵循HTTP头中的301和302重定向
  • 遵循在网页中找到的打开图URL标记
  • 遵循网页中的规范URL标记
  • 如果内容类型不是HTML页面,则快速中止下载
我当然不是HTTP重定向规则方面的专家,因此,如果有人对如何改进此库提出建议,我将不胜感激。我已经在数千个URL上进行了测试,它似乎做得很好。我听从了Mario的建议,在需要的地方使用PHP简单HTML解析器库。

使用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();
}

检查这个,我不知道我是否理解你的问题,但我认为你应该检查这个,谢谢Srisa,这是一般的想法,但是curl不遵循元标记重定向,正如公认的答案所指出的那样。。。解决方案将需要对最终重定向链接的HTML进行一些解析,然后可能会进行更多重定向,直到找到一个循环,或者我们到达重定向和rel=“canonical”链的末尾。。。我只是希望有人已经写了这封信,这样我就不必了。:)谢谢大家,我知道如何解析HTML或使用preg_match()快速拉出标记。也许找一个图书馆太过分了,但我真的希望有人花时间去做这个“正确的”。。。例如,即使考虑到hashbang和google的转义片段代码(也许还有其他一些我甚至没有想到的与URL重定向相关的事情)。谢谢荷马——我感谢你的努力。由于我没有得到任何图书馆的建议,我决定开始写我自己的,我将在接下来的几天内完成后在这里(和github上)发布它。。。我实际上是在寻找一些比仅仅遵循位置头重定向更高级的东西。我希望它能够解析页面的URL,以获得规范的、开放的图形URL,并遵循这些URL,等等。到目前为止,该库有大约500行代码,但它已经接近我所希望的工作状态了。:)听起来不错,马特。。。期待着看到你有什么。干杯