如何通过JavaScript检查网站是否可用?

11

如何使用JavaScript检查网站是否正常运行或已宕机?

5个回答

11

根据Spliffster的评论:

此代码将基于浏览器超时时间异步地尝试到达特定IP,直到其可用。您可能希望添加代码以防止它尝试太长时间。

<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>

[编辑]

附注: xmlhttprequest在跨域请求时无法工作,因为浏览器会抛出跨域异常。这个mozilla.dev链接提供了更多背景信息,并展示了使用访问控制头响应语句的示例。请注意,访问控制头字段是服务器端(正在被探测的站点),您可能无法控制该字段(默认情况下未启用)。

时间问题: 使用XMLHttpRequest进行跨域调用时存在时间差异。由于浏览器必须等待响应以评估可能的访问控制头字段,因此对不存在的网站的调用将遇到浏览器请求超时。对现有网站的调用不会遇到此超时,并且会更早地出现跨域异常错误(仅在浏览器中可见,JavaScript永远不会收到此信息!)。因此,还有可能从xmlhttprequest.send()到第一个响应(在回调中)测量时间。早期的回调调用将表明该网站从浏览器的角度来看是正常的,但至少使用XMLHttpRequest,您将无法评估返回代码(因为跨域策略会阻止此操作)。

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

8

无需使用AJAX,只需将来自远程站点的图像隐藏在您的站点中,并监视该图像的加载HTTP响应状态即可。这可能需要一些微调才能实现真正的跨浏览器兼容性。

<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>

好建议Spliffster。但是如果url不是图像,则会触发onerror事件。因此,如果我们想检查“客户端是否可以访问Facebook”,我们必须从facebook.com找到一个静态图像文件的url,并定期检查该文件的存在性。你有什么解决这个问题的想法吗? - Murat Çorlu
非常聪明,我喜欢它,而且它还解决了CORS问题...非常感谢 :) - Chris

3

进行get ajax调用并检查输出结果。

或者,进行get ajax调用到isitup.org并检查输出结果。


1
或者创建一个诊断 webservice 方法并调用它。 - stefan

2

使用JavaScript实现这个功能比较困难,因为你会遇到跨站脚本攻击的问题。

使用服务器端语言实现会更加容易,因为你可以尝试加载任何网页。

至少,你很可能需要实现一个服务器端代理来获取远程页面。有很多例子可以参考 - 告诉我你可以使用哪种服务器端语言,我可以为你找到一个例子。


我在考虑将它构建为 Mac 的仪表盘小部件,只是用于检查网站是否可用的简单工具。 - Te Riu Warren
我正在考虑你建议的方式,使用Symfony2创建一个服务。你有PHP服务器代理的例子吗? - 0x1gene

1
单独使用Ajax可能不是答案——如果您正在尝试检查远程服务器,因为默认情况下您无法通过ajax访问远程服务器。
但是,您可以访问脚本所在/驻留的服务器,这意味着您可以创建某种作为代理的脚本,例如服务器端脚本,该脚本检查所讨论的站点是否处于活动状态,并通过您的ajax调用调用该脚本。
以下是如何执行此操作的示例(PHP/C#和VB.Net): http://www.cstruter.com/articles/article/2/8 至于检查服务器状态:
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)/', $headers[0]));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接