2010-08-21 3 views
6

Je veux être en mesure de valider un formulaire pour vérifier si un site Web/page Web existe. Si elle renvoie une erreur 404 alors cela ne devrait définitivement pas valider. S'il y a une redirection ... Je suis ouvert aux suggestions, parfois les redirections vont vers une page d'erreur ou une page d'accueil, parfois elles vont à la page que vous cherchiez, donc je ne sais pas. Peut-être pour une redirection il pourrait y avoir un avis spécial qui suggère l'adresse de destination à l'utilisateur.Comment vérifier si une page Web existe. jQuery et/ou PHP

La meilleure chose que je trouve à ce jour était comme ça:

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

Cela n'a pas de problème avec 404 et 200 de son mais si vous faites quelque chose comme 'http://xyz' pour l'URL, il se bloque juste. De même, 302 et similaire déclenchent le gestionnaire d'erreurs aussi.

Ceci est une question générique assez Je voudrais un exemple complet de code de travail si quelqu'un peut en faire un. Cela pourrait être utile pour beaucoup de gens à utiliser.

+0

J'aimerais aussi le savoir. – esqew

+0

Par exister, vous voulez dire opérationnel, ou juste le domaine. –

+0

Pourriez-vous repenser l'interaction afin que l'URL puisse être vérifiée sur le serveur sans que l'utilisateur l'attende? – SargeATM

Répondre

3

Il semble que vous ne vous souciez pas du contenu de la page Web, vous voulez juste voir si elle existe. Voici comment je le ferais en PHP - je peux empêcher PHP de prendre de la mémoire avec le contenu de la page.

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

Pour moins de verbosité, remplacez le contenu de la fonction ci-dessus par ceci.

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

Voir http://www.php.net/file_get_contents pour plus de détails sur la façon de spécifier les en-têtes HTTP en utilisant un contexte de flux.

Cheers.

+0

C'est génialement simple et ça marche. Peut-être trop simple puisqu'il n'y a aucun moyen de gérer les différents codes si vous le souhaitez. Mais travaille probablement pour mes besoins actuels. – Moss

+0

Votre commentaire est très apprécié. :-) Si vous voulez activer les codes HTTP, vous devrez utiliser un mécanisme comme cURL ou sockets. Les sockets sont sympas car ils ne traînent pas dans une autre dépendance, et cURL et sont difficiles à configurer, mais vous n'obtenez pas le support natif de HTTPS avec les sockets. La méthode ci-dessus prend en charge HTTPS et de nombreux autres protocoles hors de la boîte (http://us2.php.net/manual/fr/wrappers.php). À votre santé. –

1

Vous devez d'abord vérifier que la page existe via DNS. C'est pourquoi vous dites qu'il "bloque" - il attend que la requête DNS expire. Ce n'est pas vraiment accroché. Après avoir vérifié DNS, vérifiez que vous pouvez vous connecter au serveur. C'est un autre long délai d'attente si vous ne faites pas attention.

Enfin, exécutez le HTTP HEAD et vérifiez le code d'état. Il y a beaucoup, beaucoup, beaucoup de cas particuliers que vous devez considérer ici: que signifie une "erreur de serveur interne temporaire" pour la page existante? Qu'en est-il «définitivement déplacé»? Regardez dans les codes d'état HTTP.

+0

Alors, comment pourrais-je faire vérifier 1 et 2 avec AJAX? – Moss

+0

@Moss: Je le ferais en PHP, où c'est sympa et facile. Le threading JavaScript et la réactivité de l'interface utilisateur constituent un problème. – Borealid

0

Peut-être que vous pourriez combiner le vérificateur de domaine, et jQuery, vérificateur de domaine (PHP) peut répondre 1 ou 0 pour les domaines inexistants.

par ex. http://webarto.com/snajper.php?domena=stackoverflow.com, retournera 1, vous pouvez utiliser la fonction de flou d'entrée pour le vérifier instantanément.

1

Je viens d'écrire une version plus simple en utilisant PHP:

function url_check($url) { 

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

if ($x) { 

     $reply = 1; 

     fclose($x); 

} else { 

      $reply = 0; 

} 

return $reply; 

} 

Il est évident que $url est l'URL de test, renvoie true (1) ou faux (0) en fonction de l'existence d'URL.

Questions connexes