2010-08-21 2 views
6

Я хочу, чтобы иметь возможность проверить форму, чтобы проверить, существует ли веб-сайт/веб-страница. Если он возвращает ошибку 404, то это определенно не должно проверяться. Если есть перенаправление ... Я открыт для предложений, иногда перенаправления переходят на страницу с ошибкой или на главную страницу, иногда они идут на страницу, которую вы искали, поэтому я не знаю. Возможно, для перенаправления может быть специальное уведомление, которое предлагает адрес назначения для пользователя.Как проверить, существует ли веб-страница. jQuery и/или PHP

Самое лучшее, что я нашел до сих пор было так:

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

Это не имеет никаких проблем с 404-х и 200-х, но если вы делаете что-то вроде 'http://xyz' для URL она просто висит. Также 302 и т.п. запускают обработчик ошибок.

Это достаточно общий вопрос. Я хотел бы получить полный пример рабочего кода, если кто-то может его создать. Это может быть удобно для многих людей.

+0

Я хотел бы также знать это. – esqew

+0

Существуете, вы имеете в виду и работают, или просто домен. –

+0

Не могли бы вы перепроектировать взаимодействие, чтобы URL-адрес мог быть проверен сервером без ожидания пользователя? – SargeATM

ответ

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://www.php.net/file_get_contents подробную информацию о том, как указать HTTP заголовки, используя контекст потока.

Cheers.

+0

Это блестяще просто и работает. Возможно, слишком просто, поскольку нет необходимости обрабатывать разные коды, если это необходимо. Но, вероятно, работает для моих текущих потребностей. – Moss

+0

Ваш комментарий очень оценен. :-) Если вы хотите переключиться на HTTP-коды, вам придется либо использовать такой механизм, как cURL или сокеты. Розетки хороши, потому что они не перетаскивают другую зависимость, а cURL и боль в настройке, но вы не получаете встроенную поддержку HTTPS сокетами. Вышеупомянутый метод поддерживает HTTPS и многие другие протоколы из коробки (http://us2.php.net/manual/en/wrappers.php). Приветствия. –

1

Сначала вам нужно проверить, существует ли страница через DNS. Вот почему вы говорите, что это «просто зависает» - он ждет тайм-аута DNS-запроса. На самом деле это не висит.

После проверки DNS проверьте, что вы можете подключиться к серверу. Это еще один длинный тайм-аут, если вы не будете осторожны.

Наконец, выполните HTTP HEAD и проверьте код состояния. Есть много, много и много особых случаев, которые вы должны здесь рассмотреть: что означает «временная внутренняя ошибка сервера» для существующей страницы? Как насчет «постоянно перемещенных»? Просмотрите коды состояния HTTP.

+0

Так как я могу сделать чек 1 и 2 с AJAX? – Moss

+0

@Moss: Я бы сделал это на PHP, где это приятно и легко. Проблема с потоками JavaScript и пользовательский интерфейс - это проблема. – Borealid

0

Возможно, вы могли бы объединить проверку домена, а jQuery, checker домена (PHP) может ответить 1 или 0 на несуществующие домены.

например. http://webarto.com/snajper.php?domena=stackoverflow.com, вернется 1, вы можете использовать функцию размытия входа, чтобы проверить ее мгновенно.

1

Я только что написал более простую версию с помощью PHP:

function url_check($url) { 

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

if ($x) { 

     $reply = 1; 

     fclose($x); 

} else { 

      $reply = 0; 

} 

return $reply; 

} 

Очевидно $url является тест URL, возвращает истину (1) или ложь (0) в зависимости от URL существования.

Смежные вопросы