使用JavaScript检查网站是否已启动或正常运行的最佳方法是什么?
答案 0 :(得分:8)
基于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将无法工作,因为浏览器将抛出跨源异常。 This mozilla.dev链接提供了更多背景信息,并显示了使用访问控制标头响应语句的示例。请注意,访问控制头字段是服务器端(正在探测的站点),您可能无法控制该字段(默认情况下未启用)。
时间问题 将xmlhttprequests用于跨源调用时的时序存在差异。由于浏览器必须等待响应以评估可能的访问控制头字段,因此对不存在的网站的调用将在浏览器请求超时中运行。对现有网站的调用不会遇到此超时,并且会出现错误,因为交叉来源异常(仅在浏览器中可见,javascript永远不会显示此信息!)。因此,还有可能测量从xmlhttprequest.send()到第一个响应(在回调中)的时间。早期的回调调用将表明该网站从浏览器的角度来看,但至少使用xmlhttprequest,您将无法评估返回码(因为这被阻止了bei cross origin策略)。
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
答案 1 :(得分:6)
不需要AJAX,只需从隐藏在站点中的远程站点生成映像,并监视此映像的加载HTTP响应状态。这可能需要对真正的crossbrowser兼容性进行一些调整。
<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>
答案 2 :(得分:3)
进行get ajax调用并检查输出。
或者,获取对isitup.org的ajax调用并检查输出
答案 3 :(得分:2)
使用JavaScript非常困难,因为您会遇到跨站点脚本问题。
使用服务器端语言要容易得多,因为您可以尝试加载任何网页。
至少,您很可能需要实现服务器端代理才能获取远程页面。有很多这方面的例子 - 让我知道你可以使用服务器端的语言,我可以找到一个例子。
答案 4 :(得分: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);
返回 (的preg_match( '/ ^ HTTP \ / \ d \ d \ S +(200 | 301 | 302)/', $头[0]));