2011-12-01 17 views
13

En la época de acortadores de enlaces y Ajax, puede haber muchos enlaces que, en última instancia, apuntan al mismo contenido. Me preguntaba cuál es la mejor manera de obtener el mejor enlace final para un sitio web en PHP, con suerte con una biblioteca. No pude encontrar nada en Google o GitHub.¿Cómo obtengo la URL final, redirigida y canónica de un sitio web que utiliza PHP?

He visto este código de ejemplo, pero no se ocupa de cosas como un rel = "canonical" meta tags o puertos SSL predeterminado: http://w-shadow.com/blog/2008/07/05/how-to-get-redirect-url-in-php/

Facebook parece manejar esta bastante bien, se puede ver cómo se siga de 301 y rel = "canonical", etc. Para ver ejemplos de la forma en que maneja Facebook, utilizan su herramienta Open Graph:

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

y entrar en estos enlaces:

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

¿Hay una librería PHP por ahí que ya tiene esta pre-construido, donde se comprobará si estas cabeceras, resolver 301 redirects, parse rel = "canonical", detecta redirigir los bucles y apropiadamente solo toma la mejor URL resultante para usar?

Como alternativa, estoy abierto a las API que se pueden usar, pero preferiría algo que se ejecute en mi propio servidor.

+0

comprobar esto, http://stackoverflow.com/questions/4454605/follow-redirects-with-curl -en-php – Srisa

+0

No sé si entiendo su pregunta, pero creo que debería comprobar esto http://php.net/manual/es/reserved.variables.server.php – NotGaeL

+0

Gracias Srisa, ese es el general idea, pero curl no sigue los redireccionamientos de metaetiquetas, como dice la respuesta aceptada ... La solución va a requerir un análisis sintáctico del HTML para el enlace redireccionado final, y luego potencialmente más redirecciones hasta que se ubique un ciclo o lleguemos al final de la redirección y rel = "canónico" cadena ... Fue ju Espero que alguien ya haya escrito esto, así que no es necesario. :) – Matt

Respuesta

0

Te escribí una pequeña función para hacerlo. Es simple, pero puede ser un punto de partida para ti. Nota: la URL http://dlvr.it/xxb0W devuelve una URL no válida para su encabezado de respuesta de ubicación.

Necesitará la biblioteca Altumo PHP para que funcione. Es una biblioteca que escribí, pero es una licencia de MIT, como es esta función.

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

Además, tendrá que ajustar la función en 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'); 

Háganme saber si desea más modificaciones o ayudar a ponerlo en funcionamiento.

+0

Gracias Homer - Aprecio el esfuerzo. Como no recibo ninguna sugerencia de la biblioteca, decidí comenzar a escribir la mía y la publicaré aquí (y en github) cuando esté lista en los próximos días ... De hecho, estoy buscando algo un poco más avanzado que los siguientes redireccionamientos de encabezado de ubicación * just *. Quiero que analice el de la página para obtener URL de gráficos canónicos y abiertos, seguirlos, etc. La biblioteca tiene hasta 500 líneas de código hasta el momento, pero está cerca de funcionar como deseo. :) – Matt

+0

Suena bien Matt ... esperando ver lo que tienes. Aclamaciones. – Homer6

12

Dado que no pude encontrar ninguna biblioteca que realmente hiciera lo que estaba buscando, y esperaba hacer algo más que simplemente seguir los redireccionamientos HTTP, he seguido y he creado una biblioteca que cumple los objetivos y se publicó bajo la licencia de MIT. Se puede conseguir aquí:

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

URLresolver.PHP es una clase PHP que intenta resolver las direcciones URL a una final, enlace canónica:

  • Sigue 301 y 302 redirecciones que se encuentra en las cabeceras HTTP
  • Sigue URL Open Graph <meta> etiquetas que se encuentran en la página web <cabeza>
  • Sigue URL canónica <enlace> etiquetas que se encuentra en la página web <cabeza>
  • Anula descarga qu ickly si el tipo de contenido no es una página HTML

Ciertamente no soy un experto en las reglas de redireccionamiento HTTP, por lo que si alguien tiene sugerencias sobre cómo mejorar esta biblioteca, sería muy apreciado. He probado miles de URL y parece funcionar bastante bien. Seguí el consejo de Mario y usé la biblioteca PHP Simple HTML Parser donde era necesario.

+2

útil como el hombre del infierno, gracias –

+0

Esto funciona muy bien. –

2

Usando Guzzle (un conocido y robusto cliente HTTP), puede hacerlo así:

<?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(); 
} 
Cuestiones relacionadas