Как получить окончательный, перенаправленный, канонический URL-адрес веб-сайта с использованием PHP?
В дни сокращения ссылок и 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, которые можно использовать, но предпочтет что-то, что работает на моем собственном сервере.
Ответы
Ответ 1
Поскольку мне не удалось найти библиотеки, которые действительно делали то, что я искал, и я надеялся сделать больше, чем просто переадресацию HTTP, я пошел вперед и создал библиотеку, которая выполняет цели и выпустила ее по лицензии MIT. Вы можете получить его здесь:
https://github.com/mattwright/URLResolver.php
URLResolver.php - это класс PHP, который пытается разрешить URL-адреса конечной канонической ссылке:
- Выполняет 301 и 302 перенаправления, найденные в заголовках HTTP,
- Отслеживает открытый URL-адрес графа <meta> теги, найденные на веб-странице <head>
- Выполняется канонический URL <link> теги, найденные на веб-странице <head>
- Aborts быстро загружается, если тип содержимого не является HTML-страницей.
Я, конечно, не эксперт по правилам перенаправления HTTP, поэтому, если у кого-то есть предложения по улучшению этой библиотеки, мы будем очень благодарны. Я тестировал тысячи URL-адресов, и, похоже, это очень хорошо. Я следил за советом Марио и использовал PHP Simple HTML Parser, где это было необходимо.
Ответ 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();
}
Ответ 3
Я написал вам небольшую функцию, чтобы сделать это. Это просто, но это может быть отправной точкой для вас. Примечание: 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' );
Пожалуйста, дайте мне знать, если вы хотите получить дополнительные модификации или помочь им в этом.