2011-01-27 23 views

Respuesta

7

Basado en el comentario de Spliffster:

Este código basado en el tiempo de espera del navegador tratar de llegar a una dirección IP específica hasta que esté disponible de forma asíncrona. Es posible que desee agregar código para evitar que intente demasiado.

<head> 
<script> 
function check_available(ip){ 
    var el=document.getElementById("check_pic"); 
    el.src="https://"+ip+"/images/powered_by.gif?now="+Math.random();  
} 

function check_success(url){ 
    alert("redirect now :) - url:"+url); 
} 
</script> 
</head> 

<body> 
    <img style="visibility:hidden" id='check_pic' src="/images/powered_by.gif" onabort="alert('interrupted')" onload="check_success('http://10.0.0.1/redirect/me/here')" onerror="check_available('10.17.71.150')"/> 

</body> 

[Editar]

Nota al margen: xmlhttprequest no funcionará como el navegador va a lanzar una excepción origen cruz. El enlace This mozilla.dev proporciona más información de fondo y muestra ejemplos utilizando las instrucciones de respuesta de encabezado de control de acceso. Tenga en cuenta que el campo de encabezado de control de acceso es el lado del servidor (el sitio que se está probando) y es posible que no pueda controlar ese campo (no está habilitado de manera predeterminada).

problemas de temporización Existen diferencias en el tiempo cuando se utilizan xmlhttprequests para llamadas de origen cruzadas. Dado que el navegador debe esperar la respuesta para evaluar posibles campos de encabezado de control de acceso, se ejecutará una llamada a un sitio web no existente en el tiempo de espera de solicitud de navegadores. Una llamada a un sitio web existente no se ejecutará en este tiempo de espera y error antes con una excepción de origen cruzado (solo visible en el navegador, javascript nunca genera esta información). Por lo tanto, también existe la posibilidad de medir el tiempo de xmlhttprequest.send() a primera respuesta (en devolución de llamada). Una llamada de devolución anticipada indicará que el sitio web está activo desde el punto de vista de los navegadores, pero al menos con xmlhttprequest no podrá evaluar el código de retorno (ya que está bloqueado antes de la política de origen cruzada).

self.xmlHttpReq.open('POST', strURL, true); 
self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
self.xmlHttpReq.onreadystatechange = function() { 
    //stopwatch.stop and calc timediff. timediff < default browser request timeout indicates website is up from this browsers point of view. No clues on request status or anything else, just availability 
} 
self.xmlHttpReq.send(null); 
//stopwatch.start 
3

Haga una llamada a ajax y examine la salida.

O bien, hacer una llamada ajax get a isitup.org y examinar la salida

+1

O haga un método de servicio web de diagnóstico y llámelo. – stefan

2

que es bastante difícil de hacer con JavaScript como se encontrará con problemas de cross-site scripting.

Es mucho más fácil hacerlo con un lenguaje del lado del servidor ya que puede intentar cargar cualquier página web.

Por lo menos, lo más probable es que necesite implementar un proxy del lado del servidor para obtener la página remota para usted. Hay muchos ejemplos para esto: dígame qué idioma puede usar en el servidor y puedo encontrar un ejemplo.

+0

Estaba pensando en compilarlo en un Widget para computadora, solo para verificar si un sitio está activo o no. –

+0

Estoy pensando en hacer wat que sugiera, creando un servicio en symfony2. ¿Tiene algún ejemplo de proxy del lado del servidor en PHP? – 0x1gene

5

No se requiere AJAX, solo plantéese una imagen desde el sitio remoto oculto en su sitio y supervise el estado de respuesta HTTP de carga de esta imagen. Esto podría necesitar algunos ajustes para una verdadera compatibilidad con navegador cruzado.

<script type="text/javascript"> 
function set_test(name,status){ 
    var el=document.getElementById(name+'_test'); 
    el.innerHTML=status?'Yes, you are logged in':'No, you\'re not logged in'; 
    el.style.color=status?'#0a0':'#a00'; 
    el.style.fontWeight='bold'; 
} 
(function(){ 
    var gmail_test=document.getElementById('gmail_test'); 
    gmail_test.innerHTML='Checking...'; 
    var img=document.createElement('img'); 
    img.src='//mail.google.com/mail/photos/static/AD34hIhNx1pdsCxEpo6LavSR8dYSmSi0KTM1pGxAjRio47pofmE9RH7bxPwelO8tlvpX3sbYkNfXT7HDAZJM_uf5qU2cvDJzlAWxu7-jaBPbDXAjVL8YGpI?rand='+Math.random(); 
    img.onload=function(){set_test('gmail',1)}; 
    img.onerror=function(){set_test('gmail',0)}; 
    img.style.display='none'; 
    document.body.appendChild(img); 
})(); 
</script> 
+0

Good suggestiong Spliffster. Pero si url no es una imagen, se activa el evento onerror. Por lo tanto, si queremos verificar "puede llegar el cliente a Facebook", tenemos que encontrar una URL de archivo de imagen estática de facebook.com y debemos verificar periódicamente la existencia de ese archivo. ¿Tienes una idea para ese problema? –

+0

bastante inteligente, me encanta, y también resuelve el problema CORS ... muchas gracias :) – Chris

1

Ajax sola podría no ser la respuesta - si usted está tratando de comprobar un servidor remoto, ya que por defecto no se puede acceder a un servidor remoto a través de ajax.

Sin embargo, puede acceder al servidor donde reside o subsiste el script, lo que significa que puede crear algún tipo de script que actúe como proxy, p. script del lado del servidor que verifica si el sitio en cuestión está activo y llama a ese script a través de su llamada ajax.

Un ejemplo (PHP/C# & VB.Net) de cómo hacer esto: http://www.cstruter.com/articles/article/2/8

Como para comprobar el estado del servidor:

C#

 string URL = "http://www.stackoverflow.com"; 
    WebRequest request = WebRequest.Create(URL); 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    //if (response.StatusCode == HttpStatusCode.something 

PHP

@$headers = get_headers($url); 

return (preg_match ('/^HTTP \/\ d. \ D \ s + (200 | 301 | 302) /', $ encabezados [0]));

Cuestiones relacionadas