2010-08-21 65 views
6

Tôi muốn có thể xác thực biểu mẫu để kiểm tra xem trang web/trang web có tồn tại không. Nếu nó trả về lỗi 404 thì chắc chắn không nên xác thực. Nếu có một chuyển hướng ... Tôi mở để gợi ý, đôi khi chuyển hướng đi đến một trang lỗi hoặc trang chủ, đôi khi họ đi đến trang bạn đang tìm kiếm, vì vậy tôi không biết. Có lẽ để chuyển hướng, có thể có một thông báo đặc biệt gợi ý địa chỉ đích cho người dùng.Cách kiểm tra xem trang web có tồn tại không. jQuery và/hoặc PHP

Điều tốt nhất tôi tìm thấy cho đến nay là như thế này:

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

Đó không có vấn đề với 404 và 200, nhưng nếu bạn làm điều gì đó như 'http://xyz' cho url nó chỉ bị treo. Ngoài ra 302 và tương tự cũng kích hoạt trình xử lý lỗi.

Đây là một câu hỏi đủ chung tôi muốn có một ví dụ mã làm việc hoàn chỉnh nếu ai đó có thể tạo một. Điều này có thể thuận tiện cho nhiều người sử dụng.

+0

Tôi cũng muốn biết điều này. – esqew

+0

Bởi tồn tại, bạn có nghĩa là lên và chạy, hoặc chỉ là tên miền. –

+0

Bạn có thể thiết kế lại tương tác sao cho URL có thể được xác minh trên máy chủ mà không cần người dùng chờ nó không? – SargeATM

Trả lời

3

Có vẻ như bạn không quan tâm đến nội dung của trang web, bạn chỉ muốn xem nó có tồn tại hay không. Đây là cách tôi làm điều đó trong PHP - tôi có thể ngăn chặn PHP lấy bộ nhớ với nội dung của trang.

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

Để bớt chi tiết, hãy thay thế nội dung của hàm trên bằng cách này.

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

Xem http://www.php.net/file_get_contents để biết chi tiết về cách chỉ định tiêu đề HTTP bằng ngữ cảnh luồng.

Chúc mừng.

+0

Đó là đơn giản rực rỡ và nó hoạt động. Có lẽ quá đơn giản vì không có cách nào để xử lý các mã khác nhau nếu muốn. Nhưng có lẽ làm việc cho nhu cầu hiện tại của tôi. – Moss

+0

Nhận xét của bạn được đánh giá rất cao. :-) Nếu bạn muốn chuyển đổi mã HTTP, thì bạn sẽ phải sử dụng cơ chế như cURL hoặc ổ cắm. Ổ cắm là tốt đẹp bởi vì họ không kéo trong một phụ thuộc, và cURL và là một nỗi đau để cấu hình, nhưng bạn không nhận được hỗ trợ HTTPS bản địa với ổ cắm. Phương thức trên không hỗ trợ HTTPS và nhiều giao thức khác ngoài hộp (http://us2.php.net/manual/en/wrappers.php). Chúc mừng. –

1

Trước tiên, bạn cần kiểm tra xem trang có tồn tại qua DNS hay không. Đó là lý do tại sao bạn nói "chỉ bị treo" - nó đang chờ truy vấn DNS hết thời gian chờ. Nó không thực sự treo.

Sau khi kiểm tra DNS, hãy kiểm tra xem bạn có thể kết nối với máy chủ không. Đây là một thời gian chờ lâu hơn nếu bạn không cẩn thận.

Cuối cùng, thực hiện HEAD HTTP và kiểm tra mã trạng thái. Có rất nhiều, nhiều, nhiều trường hợp đặc biệt bạn phải xem xét ở đây: "lỗi máy chủ nội bộ tạm thời" có ý nghĩa gì đối với trang hiện có? Còn "di chuyển vĩnh viễn" thì sao? Xem xét mã trạng thái HTTP.

+0

Vậy làm cách nào tôi có thể thực hiện kiểm tra 1 và 2 bằng AJAX? – Moss

+0

@ Moss: Tôi sẽ làm điều đó trong PHP, nơi nó đẹp và dễ dàng. Sự phân luồng JavaScript và đáp ứng UI là một vấn đề. – Borealid

0

Có thể bạn có thể kết hợp bộ kiểm tra miền và jQuery, trình kiểm tra miền (PHP) có thể phản hồi 1 hoặc 0 đối với các miền không tồn tại.

ví dụ: http://webarto.com/snajper.php?domena=stackoverflow.com, sẽ trả về 1, bạn có thể sử dụng chức năng làm mờ đầu vào để kiểm tra ngay lập tức.

1

Tôi vừa mới viết một phiên bản đơn giản sử dụng PHP:

function url_check($url) { 

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

if ($x) { 

     $reply = 1; 

     fclose($x); 

} else { 

      $reply = 0; 

} 

return $reply; 

} 

Rõ ràng $url là URL kiểm tra, trả về true (1) hoặc false (0) tùy thuộc vào sự tồn tại URL.

Các vấn đề liên quan