2011-12-01 7 views
13

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

Я видел этот пример кода, но он не обрабатывает вещи, как отн = «канонические» мета-теги или SSL по умолчанию порты: http://w-shadow.com/blog/2008/07/05/how-to-get-redirect-url-in-php/

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

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

и введите следующие ссылки:

Http: // DLVR .it/xxb0W
https://twitter.com/#!/twitter/statuses/136946408275193856

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

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

+0

Проверить это, http://stackoverflow.com/questions/4454605/follow-redirects-with-curl -in-php – Srisa

+0

Я не знаю, понимаю ли я ваш вопрос, но я думаю, вы должны проверить это http://php.net/manual/es/reserved.variables.server.php – NotGaeL

+0

Спасибо, Srisa, то есть общий идея, но curl не соответствует перенаправления метатега, поскольку принятые ответы на ответы ... Решение потребует некоторого разбора HTML для окончательной перенаправленной ссылки, а затем потенциально больше перенаправления до тех пор, пока цикл не будет расположен или мы не достигнем конец переадресации и rel = "каноническая" цепочка ... Был ju в надежде, что кто-то уже написал это, поэтому мне не нужно. :) – Matt

ответ

0

Я написал вам небольшую функцию, чтобы сделать это. Это просто, но это может быть отправной точкой для вас. Примечание: URL-адрес http://dlvr.it/xxb0W возвращает недопустимый URL-адрес для заголовка ответа местоположения.

Для этого вам понадобится библиотека PHP Altumo. Это библиотека, которую я написал, но это лицензия MIT, как и эта функция.

См: https://github.com/homer6/altumo

Кроме того, вам придется обернуть эту функцию в Try/уловом.

/** 
* 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'); 

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

+0

Спасибо, Гомер, я ценю усилие. Поскольку я не получаю никаких предложений по библиотеке, я решил начать писать самостоятельно, и я отправлю его здесь (и на github), когда это будет сделано в ближайшие пару дней ... Я действительно ищу что-то более продвинутое, чем следующий * просто * перенаправление заголовка местоположения. Я хочу, чтобы он проанализировал страницу , чтобы получить канонические и открытые графические URL-адреса, следовать этим и т. Д. До сих пор библиотека насчитывала около 500 строк кода, но она близка к работе, как я желаю. :) – Matt

+0

Звучит неплохо Мэтт ... с нетерпением жду, чтобы увидеть, что у вас есть. Приветствия. – Homer6

12

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

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

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

  • следующим образом 301 и 302 перенаправляет найдено в HTTP заголовках
  • Следит URL-адрес Open Graph < мета > теги, найденные в веб-страницы < головы >
  • Следит каноническую версию страницы < ссылку > теги найденную в веб-страницы < головы >
  • Прерывает загрузить Цюй ickly, если тип контента не является HTML-страницей.

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

+2

полезно, как черт мужчина, спасибо –

+0

Это работает очень хорошо. –

2

Использование жрать (хорошо известный и надежный клиент 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(); 
}