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

Mat*_*att 13 php redirect url-shortener canonical-link

在链接缩短程序和Ajax的时代,可能有许多链接最终指向相同的内容.我想知道什么是最好的方法来获得PHP的网站的最终,最好的链接,希望有一个库.我无法在Google或GitHub上找到任何内容.

我已经看过这个示例代码,但它不处理像rel ="canonical"元标记或默认ssl端口之类的东西:http://w-shadow.com/blog/2008/07/05/how-to-得到重定向的URL功能于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持开放态度,但更喜欢在我自己的服务器上运行的东西.

Mat*_*att 12

由于我无法找到真正做到我想要的任何库,而且我希望做的不仅仅是关注HTTP重定向,我已经继续创建了一个库来完成目标并在MIT下发布它执照.你可以在这里得到它:

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

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

  • 遵循HTTP标头中的301和302重定向
  • 按照网页<head>中的Open Graph URL <meta>标记进行操作
  • 按照网页<head>中的Canonical URL <link>标记进行操作
  • 如果内容类型不是HTML页面,则快速下载

我当然不是HTTP重定向规则的专家,所以如果有人有关于如何改进这个库的建议,我将不胜感激.我已经测试了数以千计的URL,它似乎做得很好.我按照Mario的建议,在需要的地方使用了PHP Simple HTML Parser库.


Hom*_*er6 0

我给你写了一个小函数来做到这一点。这很简单,但它可能是您的起点。注意:http://dlvr.it/xxb0W url 返回其 Location 响应标头的无效 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' );
Run Code Online (Sandbox Code Playgroud)

如果您需要进一步修改或帮助实现它,请告诉我。