2011-12-01 11 views
13

Nei giorni dei link shortener e di Ajax, ci possono essere molti link che in definitiva puntano allo stesso contenuto. Mi stavo chiedendo quale sia il modo migliore per ottenere il link finale migliore per un sito web in PHP, si spera con una libreria. Non sono riuscito a trovare nulla su Google o GitHub.Come posso ottenere l'URL finale, reindirizzato, canonico di un sito Web utilizzando PHP?

Ho visto questo codice di esempio, ma non gestisce le cose come un rel = "canonical" meta-tag o porte di default SSL: http://w-shadow.com/blog/2008/07/05/how-to-get-redirect-url-in-php/

Facebook sembra gestire questo abbastanza bene, si può vedere come si seguire 301 e di rel = "canonical", ecc Per vedere esempi del modo in cui Facebook gestisce, utilizzare il loro strumento Grafico Aperto:

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

e inserire questi collegamenti:

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

C'è una libreria PHP là fuori che ha già questa pre-costruito, dove si verifica la presenza di queste intestazioni, risolvere 301 reindirizza, parse rel = "canonical", rileva i loop di reindirizzamento e appropri correttamente l'URL risultante migliore da usare?

In alternativa, sono aperto alle API che possono essere utilizzate, ma preferirei qualcosa che viene eseguito sul mio server.

+0

Controllare questo, http://stackoverflow.com/questions/4454605/follow-redirects-with-curl -in-php – Srisa

+0

Non so se comprendo la tua domanda, ma penso che dovresti controllare questo http://php.net/manual/es/reserved.variables.server.php – NotGaeL

+0

Grazie Srisa, questo è il generale idea, ma l'arricciatura non segue i reindirizzamenti dei meta tag, come le note di risposta accettate ... La soluzione richiederà un po 'di analisi dell'HTML per il collegamento reindirizzato finale, e quindi potenzialmente più reindirizzamenti fino a quando un loop si trova o raggiungiamo il fine della catena di reindirizzamento e rel = "canonica" ... Era ju Sto sperando che qualcuno abbia già scritto questo, quindi non devo. :) – Matt

risposta

0

Ti ho scritto una piccola funzione per farlo. È semplice, ma potrebbe essere un punto di partenza per te. Nota: l'URL http://dlvr.it/xxb0W restituisce un URL non valido per la sua intestazione di risposta Location.

Avrai bisogno della libreria PHP di Altumo perché funzioni. È una libreria che ho scritto, ma è la licenza MIT, così come questa funzione.

See: https://github.com/homer6/altumo

Inoltre, si dovrà avvolgere la funzione in un 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'); 

Per favore fatemi sapere se desiderate ulteriori modifiche o aiutatemi a farlo funzionare.

+0

Grazie Homer - Apprezzo lo sforzo. Dal momento che non ricevo alcun suggerimento di libreria, ho deciso di iniziare a scrivere il mio e lo posterò qui (e su github) quando sarà fatto nei prossimi due giorni ... In realtà sto cercando qualcosa di un po 'più avanzato di seguendo * solo * i reindirizzamenti delle intestazioni di posizione. Voglio che analizzi lo della pagina per ottenere URL canonici e aperti del grafo, segui quelli, ecc. La libreria ha fino a circa 500 righe di codice fino ad ora, ma è vicina a lavorare come desidero. :) – Matt

+0

Sembra buono Matt ... non vedo l'ora di vedere cosa hai. Saluti. – Homer6

12

Dal momento che non ero in grado di trovare alcuna libreria che realmente facesse quello che stavo cercando, e speravo di fare qualcosa di più che seguire i reindirizzamenti HTTP, sono andato avanti e ho creato una libreria che realizza gli obiettivi e rilasciata sotto la licenza del MIT. È possibile ottenere qui:

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

URLResolver.php è una classe PHP che tenta di risolvere gli URL per una finale, link canonico:

  • Segue 301 e 302 redirect trovati nelle intestazioni HTTP
  • Segue Open Graph URL <meta> tag trovato nella pagina web <testa>
  • Segue Canonical URL <collegamento> tag trovato nella pagina web <testa>
  • Aborts scaricare qu ickly se il tipo di contenuto non è una pagina HTML

Non sono certamente un esperto delle regole di reindirizzamento HTTP, quindi se qualcuno ha suggerimenti su come migliorare questa libreria, sarebbe molto apprezzato. Ho testato migliaia di URL e sembra che funzioni abbastanza bene. Ho seguito il consiglio di Mario e ho usato la libreria PHP Simple HTML Parser dove necessario.

+2

utile come uomo infernale, grazie –

+0

Questo funziona davvero bene. –

2

Utilizzando Guzzle (un ben noto e robusto client HTTP) si può fare così:

<?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(); 
} 
Problemi correlati