2010-08-21 74 views
6

我希望能夠驗證表單以檢查網站/網頁是否存在。如果它返回一個404錯誤,那肯定不應該驗證。如果有重定向...我願意接受建議,有時重定向會轉到錯誤頁面或主頁,有時會轉到您正在尋找的頁面,所以我不知道。也許對於重定向,可能會有一個特殊的通知,向用戶建議目標地址。如何檢查網頁是否存在。 jQuery和/或PHP

我找到的最好的事情,到目前爲止是這樣的:

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

這與404的和200的,但如果你的URL這樣做'http://xyz'它只是掛起沒有問題。此外,302等也觸發錯誤處理程序。

這是一個足夠通用的問題,我想要一個完整的工作代碼示例,如果有人可以做一個。這對很多人來說可能很方便。

+0

我想知道這一點。 – esqew 2010-08-21 03:13:33

+0

通過存在,你的意思是啓動和運行,或只是域。 – 2010-08-21 03:24:20

+0

您是否可以重新設計交互,以便可以在不需要用戶等待的情況下對URL進行驗證? – SargeATM 2010-08-21 03:40:44

回答

3

這聽起來像你不關心網頁的內容,你只是想看看它是否存在。以下是我如何在PHP中實現它 - 我可以阻止PHP佔用頁面內容的內存。

/* 
* 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); 
} 

爲了減少冗長,請用上述函數替換上述函數的內容。

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

有關如何指定使用流上下文的HTTP頭詳見http://www.php.net/file_get_contents

乾杯。

+0

這是非常簡單,它的作品。可能太簡單了,因爲如果需要,沒有辦法處理不同的代碼。但可能適用於我目前的需求。 – Moss 2010-08-21 05:55:32

+0

您的評論非常感謝。 :-)如果你想切換HTTP代碼,那麼你必須使用像cURL或套接字這樣的機制。套接字很好,因爲它們不會在另一個依賴中拖動,並且cURL並且很難配置,但是您不會使用套接字獲得本機HTTPS支持。上述方法確實支持HTTPS和許多其他開箱即用的協議(http://us2.php.net/manual/en/wrappers.php)。乾杯。 – 2010-08-23 17:22:22

1

首先你需要檢查頁面是否通過DNS存在。這就是爲什麼你說它「只是掛起」 - 它正在等待DNS查詢超時。它並沒有真正掛起。

檢查DNS後,檢查您是否可以連接到服務器。如果你不小心,這是另一個很長的超時時間。

最後,執行HTTP HEAD並檢查狀態碼。在這裏你需要考慮許多,很多很多特殊情況:對於存在的頁面,「臨時內部服務器錯誤」意味着什麼?什麼「永久移動」?查看HTTP狀態代碼。

+0

那麼我怎麼能用AJAX來檢查1和2? – Moss 2010-08-21 06:13:44

+0

@Moss:我會用PHP做它,它很好用,很容易。 JavaScript線程和UI響應是一個問題。 – Borealid 2010-08-21 06:26:43

1

我剛剛寫了使用PHP的簡單版本:

function url_check($url) { 

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

if ($x) { 

     $reply = 1; 

     fclose($x); 

} else { 

      $reply = 0; 

} 

return $reply; 

} 

顯然$url是測試URL,返回true(1)或假取決於URL存在(0)。