2010-08-21 10 views
6

Quiero ser capaz de validar un formulario para verificar si existe un sitio web/página web. Si devuelve un error 404, entonces definitivamente no debería validar. Si hay un redireccionamiento ... Estoy abierto a sugerencias, a veces los redireccionamientos van a una página de error o página de inicio, a veces van a la página que estaba buscando, así que no sé. Quizás para un redireccionamiento podría haber un aviso especial que sugiera la dirección de destino para el usuario.Cómo verificar si existe una página web. jQuery y/o PHP

Lo mejor que he encontrado hasta ahora era así:

$.ajax({url: webpage ,type:'HEAD',error:function(){ 
    alert('No go.'); 
}}); 

que no tiene ningún problema de 404 y 200 del pero si haces algo como 'http://xyz' para la url simplemente se cuelga. También 302 y similares activan el manejador de errores también.

Esto es una pregunta lo suficientemente genérica Me gustaría un ejemplo de código de trabajo completo si alguien puede hacer uno. Esto podría ser útil para muchas personas.

+0

Me gustaría saber esto también. – esqew

+0

Al existir, te refieres a la ejecución y solo al dominio. –

+0

¿Podría rediseñar la interacción para que la URL pueda verificarse en el servidor sin que el usuario lo espere? – SargeATM

Respuesta

3

Parece que no le importan los contenidos de la página web, solo quiere ver si existe. Así es como lo haría en PHP: puedo evitar que PHP ocupe la memoria con los contenidos de la página.

/* 
* Returns false if the page could not be retrieved (ie., no 2xx or 3xx HTTP 
* status code). On success, if $includeContents = false (default), then we 
* return true - if it's true, then we return file_get_contents()'s result (a 
* string of page content). 
*/ 
function getURL($url, $includeContents = false) 
{ 
    if($includeContents) 
    return @file_get_contents($url); 

    return (@file_get_contents($url, null, null, 0, 0) !== false); 
} 

Para menos verbosidad, reemplace los contenidos de la función anterior con esto.

return ($includeContents) ? 
       @file_get_contents($url) : 
       (@file_get_contents($url, null, null, 0, 0) !== false) 
; 

Ver http://www.php.net/file_get_contents para obtener detalles sobre cómo especificar las cabeceras HTTP usando un contexto de secuencia.

Saludos.

+0

Eso es brillantemente simple y funciona. Tal vez demasiado simple, ya que no hay manera de manejar los diferentes códigos si así lo desea. Pero probablemente funcione para mis necesidades actuales. – Moss

+0

Su comentario es muy apreciado. :-) Si quiere entrar en el cambio de códigos HTTP, entonces tendrá que usar un mecanismo como cURL o sockets. Los sockets son agradables porque no arrastran en otra dependencia, y cURL y son difíciles de configurar, pero no se obtiene soporte HTTPS nativo con sockets. El método anterior es compatible con HTTPS y muchos otros protocolos listos para usar (http://us2.php.net/manual/en/wrappers.php). Aclamaciones. –

1

Primero debe comprobar que la página existe a través de DNS. Es por eso que dices que "simplemente se cuelga": está esperando que la consulta DNS expire. En realidad no está colgado.

Después de verificar DNS, compruebe que se puede conectar al servidor. Este es otro tiempo de espera prolongado si no tienes cuidado.

Finalmente, ejecute HTTP HEAD y verifique el código de estado. Hay muchos, muchos, muchos casos especiales que debe considerar aquí: ¿qué significa un "error de servidor interno temporal" para la página existente? ¿Qué pasa con "movido permanentemente"? Mire en los códigos de estado HTTP.

+0

Entonces, ¿cómo podría hacer los controles 1 y 2 con AJAX? – Moss

+0

@Moss: Lo haría en PHP, donde es agradable y fácil. El enhebrado de JavaScript y la capacidad de respuesta de la interfaz de usuario son un problema. – Borealid

0

Quizás podría combinar el comprobador de dominio, y jQuery, el comprobador de dominio (PHP) puede responder 1 o 0 para dominios inexistentes.

por ejemplo. http://webarto.com/snajper.php?domena=stackoverflow.com, devolverá 1, puede usar la función de desenfoque de entrada para verificarlo al instante.

1

que acabo de escribir una versión más simple usando PHP:

function url_check($url) { 

$x = @fopen($url,"r"); 

if ($x) { 

     $reply = 1; 

     fclose($x); 

} else { 

      $reply = 0; 

} 

return $reply; 

} 

Obviamente $url es el URL de prueba, devuelve verdadero (1) o falso (0), dependiendo de la existencia de URL.

Cuestiones relacionadas