簡體   English   中英

通過 JavaScript 檢查網站是否啟動的最佳方法是什么

[英]What's the best way to check if a website is up or not via JavaScript

使用 JavaScript 檢查網站是否正常運行或關閉的最佳方法是什么?

根據 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鏈接提供了更多背景信息,並顯示了使用訪問控制標頭響應語句的示例。 請注意,訪問控制標頭字段是服務器端(正在被探測的站點),您可能無法控制該字段(默認情況下未啟用)。

計時問題使用 xmlhttprequests 進行跨源調用時,計時存在差異。 由於瀏覽器必須等待響應以評估可能的訪問控制標頭字段,因此對不存在的網站的調用將遇到瀏覽器請求超時。 對現有網站的調用不會遇到此超時,並且會因跨源異常而提前出錯(僅在瀏覽器中可見,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

不需要 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>

進行 get ajax 調用並檢查輸出。

或者,對 isitup.org 進行 get ajax 調用並檢查輸出

JavaScript 很難做到這一點,因為您會遇到跨站點腳本問題。

使用服務器端語言要容易得多,因為您可以嘗試加載任何網頁。

至少,您很可能需要實現服務器端代理來為您獲取遠程頁面。 有很多示例 - 讓我知道您可以使用服務器端的語言,我可以為您找到一個示例。

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]));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM