Cita:
Iniciado por Rednapx Si, he notado que mucha gente se confunde cuando trato de explicarlo xD, voy a tratar de explicarlo de la manera mas clara posible
Supongamos que tengo un sitio "http://computadoras.com" y que quiero hacer un enlace hacia la pagina "http://internet.com"
Lo que quiero que haga este script es que verifique que "http://internet.com" esta online cada vez que hagan clic en el enlace.
Si resuelve que esta online (que resuelve un error 200) entonces que redireccione o vaya hacia esa pagina, pero si al dar clic el script detecta que "http://internet.com" resuelve un error 404 que entonces redireccione, digamos, hacia google.
Saludos, gracias por sus respuestas.
Ok .. pues es eso lo que te respondí sobre el uso de sockets.. El caso es que tendras que tener un script "lanzador" de tus redireccionamientos donde harás varias cosas:
ir_a_url.php?url=http://www.nosedonde.tal
ese "ir_a_url" .. por sockets intenta la conexión (el ejemplo lo tienes en la documentación de la función fsockopen() que te dejé antes) .. ahí mismo (sin que el "script" salga de su ejecución) vas a obtener la respuesta de esa conexión .. como es HTTP vas a ver unas cabeceras con cierta información (que puedes ver en:
http://www.w3.org/Protocols/rfc2068/rfc2068 )
Eso es el protocolo HTTP .. en PHP tienes funciones para "escuchar" ese scoket abierto (fgets ...) y como "variable" que te quedará puedes buscar lo que te intresa .. ese "dato" de error 400 .. 500 .. etc ...
En ese link (del manual oficial de PHP .. que no se si vistes), tienes un ejemplo (en los comentarios de los usuarios .. hay muchos):
jack at jtr dot de
17-Feb-2004 12:05
Here is a function for testing a website/URI for availability:
Código PHP:
<?php
/*
* @return boolean
* @param string $link
* @desc Überprüft die angegeben URL auf Erreichbarkeit (HTTP-Code: 200)
*/
function url_validate( $link )
{
$url_parts = @parse_url( $link );
if ( empty( $url_parts["host"] ) ) return( false );
if ( !empty( $url_parts["path"] ) )
{
$documentpath = $url_parts["path"];
}
else
{
$documentpath = "/";
}
if ( !empty( $url_parts["query"] ) )
{
$documentpath .= "?" . $url_parts["query"];
}
$host = $url_parts["host"];
$port = $url_parts["port"];
// Now (HTTP-)GET $documentpath at $host";
if (empty( $port ) ) $port = "80";
$socket = @fsockopen( $host, $port, $errno, $errstr, 30 );
if (!$socket)
{
return(false);
}
else
{
fwrite ($socket, "HEAD ".$documentpath." HTTP/1.0\r\nHost: $host\r\n\r\n");
$http_response = fgets( $socket, 22 );
if ( ereg("200 OK", $http_response, $regs ) )
{
return(true);
fclose( $socket );
} else
{
// echo "HTTP-Response: $http_response<br>";
return(false);
}
}
}
?>
Fijate como se controla ahí uno de ellos .. el código "200". Con la misma filosofía puedes gestionar otros códigos de error. De hecho no he visto más ejemplos .. pero seguro que hay alguno más completo .. la técnica es la misma.
con ese dato ya "localizado" e identificado .. si requieres redireccionar a un sitio .. tan sólo debes usar:
header ("Location: http://www.nose.tal") ... o continuar el redireccinamiento hacia donde se "pedía:
header("Location: $_GET['url']");
Un saludo,