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:

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;
}
?>