Как получить окончательный, перенаправленный, канонический URL-адрес веб-сайта с использованием PHP?

Во времена укорочения ссылок и Ajax может быть много ссылок, которые в конечном итоге указывают на один и тот же контент. Мне было интересно, как лучше всего получить окончательную, лучшую ссылку для веб-сайта в PHP, надеюсь, с библиотекой. Мне не удалось найти что-либо в Google или GitHub.

Я видел этот примерный код, но он не обрабатывает такие вещи, как метатеги rel = "canonical" или порты ssl по умолчанию: http://w-shadow.com/blog/2008/07/05/how-to- получить переадресовывать-url-в-PHP /

Facebook, похоже, справляется с этим довольно хорошо, вы можете видеть, как они следуют 301 и rel = «канонические» и т. Д. Чтобы увидеть примеры того, как Facebook справляется с этим, используйте их инструмент Open Graph:

https://developers.facebook.com/tools/debug

и введите эти ссылки:

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

Есть ли там библиотека PHP, которая уже имеет эту предварительную сборку, где она будет проверять эти заголовки, разрешать 301 переадресацию, анализировать rel = «канонические», обнаруживать петли перенаправления и правильно просто захватывать лучший полученный URL-адрес для использования?

В качестве альтернативы я открыт для API, которые можно использовать, но предпочтет что-то, что работает на моем собственном сервере.

    Поскольку я не мог найти библиотеки, которые действительно делали то, что я искал, и я надеялся сделать больше, чем просто следовать переадресации HTTP, я пошел вперед и создал библиотеку, которая выполняет цели и выпустила ее под MIT лицензия. Вы можете получить его здесь:

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

    URLResolver.php – это класс PHP, который пытается разрешить URL-адреса конечной канонической ссылке:

    • Выполняет 301 и 302 перенаправления, найденные в заголовках HTTP
    • Следит за тегами Open Graph URL <meta>, найденными на веб-странице <head>
    • Выполняется канонический URL <link>, найденный на веб-странице <head>
    • Aborts загружается быстро, если тип контента не является HTML-страницей

    Я, конечно, не эксперт по правилам перенаправления HTTP, поэтому, если у кого-то есть предложения по улучшению этой библиотеки, мы будем очень благодарны. Я тестировал тысячи URL-адресов, и, похоже, это очень хорошо. Я следовал совету Марио и использовал PHP Simple HTML Parser, где это было необходимо.

    Используя 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(); } 

    Я написал вам небольшую функцию, чтобы сделать это. Это просто, но это может быть отправной точкой для вас. Примечание: URL-адрес 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' ); 

    Пожалуйста, дайте мне знать, если вы хотите получить дополнительные модификации или помогите добиться этого.