Encontrar enlaces rotos en una página web usando PHP



Si tienes un sitio web, un blog o una aplicación web, sabes lo malo que puede resultar tener enlaces muertos o rotos. En este artículo voy a mostrarte como puedes crear tu propio programa para encontrar esos enlaces muertos o rotos.

Cuando intentamos ingresar a un enlace o link, siempre vamos a recibir una respuesta, ya sea que el destino exista o no. Dentro de esa respuesta se encuentran las cabeceras HTTP.

Debido a que nuestro objetivo es encontrar enlaces rotos, nos interesa aquellos que regresen un código HTTP como este: HTTP/1.1 404 Not Found

Para obtener las cabeceras de una página web usando PHP podemos usar la función get_headers($url), esta función recibe como parámetro una dirección web (como un enlace o link) y nos regresa un array con todas las cabeceras, algo así como esto:

Encontrar enlaces muertos o rotos en php
Salida de la función get_headers

Podemos usar un código como este, para definir si un enlace está roto o muerto:

<?php
$url = 'http://www.ejemplo.com/no_existe/';
if (enlace_roto($url)) {
   echo "Enlace roto: " . $url;
}
/*
  Regresa true, si el enlace esta roto
  revisando el codigo http 404
*/
function enlace_roto($url)
{
  $head = get_headers($url);
  return ($head[0]  == 'HTTP/1.1 404 Not Found') ? true : false;
}
 ?>

Como puedes ver el trabajo lo hace una función que evalúa la cabecera usando el operador ternario de PHP para hacer el código más compacto y fácil de leer. La ventaja de haber creado una función para esto, es que podemos reutilizarla y hacer que nuestro programa sea mucho más automatizado.

Voy a reescribir el programa para que reciba una página web y busque todos los enlaces que contiene y revise si existe algún enlace muerto.

NOTA: Antes de continuar o probar el código, debes saber como encontrar los enlaces en una página web, en este articulo explico como se hace y la librería que tienes que activar.

Ahora para probar el ejemplo solo crea un archivo de extensión PHP y copia el siguiente código, solo debes cambiar la variable $url por la página web que desees probar y te dirá si los enlaces están bien o están rotos.

<?php
$url = 'https://www.google.com/';
// Obtener el codigo HTML de la pagina a analizar
$html=file_get_contents($url);
$doc = new DOMDocument();
$opts = array('output-xhtml' => true,
              'numeric-entities' => true);
$doc->loadXML(tidy_repair_string($html,$opts));
$xpath = new DOMXPath($doc);
$xpath->registerNamespace('xhtml','http://www.w3.org/1999/xhtml');
foreach ($xpath->query('//xhtml:a/@href') as $node) {
    $link =  (( substr($node->nodeValue,0,4) == 'http' ) ?  $node->nodeValue : $url . $node->nodeValue ) ;
    // Ok, ya tienes el link, has lo que necesites con el.
    if (enlace_roto($link) )
    {
       echo '[enlace roto] '. $link . '<br>';
    }
    else {
        echo '[enlace ok] '. $link . '<br>';
    }
}
/*
  Regresa true, si el enlace esta roto
  revisando el codigo http 404
*/
function enlace_roto($url)
{
  $head = get_headers($url);
  return ($head[0]  == 'HTTP/1.1 404 Not Found') ? true : false;
}
 ?>

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *