Désolé pour la réponse tardive à cette question, mais je pense qu'elle mérite une meilleure réponse.
Il y a trois façons d'aborder cette question :
- Vérification stricte si l'URL existe
- Vérifiez si vous demandez l'URL correctement
- Vérifiez si vous pouvez le demander correctement et si le serveur peut y répondre correctement.
1. Vérification stricte de l'existence de l'URL
Alors que 200
signifie que le serveur répond à cette URL (donc, l'URL existe), répondre à un autre code de statut ne signifie pas que l'URL n'existe pas. Par exemple, répondre à 302 - redirected
signifie que l'URL existe et qu'elle est redirigée vers une autre. Pendant la navigation, 302
se comporte souvent de la même manière que 200
à l'utilisateur final. Les autres codes d'état qui peuvent être renvoyés si une URL existe sont les suivants 500 - internal server error
. Après tout, si l'URL n'existe pas, comment se fait-il que le serveur d'application ait traité votre demande au lieu de renvoyer tout simplement 404 - not found
?
Il n'y a donc en fait que deux cas où une URL n'existe pas : Lorsque le serveur n'existe pas ou lorsque le serveur existe mais ne trouve pas le chemin d'accès de l'URL donnée n'existe pas. Ainsi, le seul moyen de vérifier si l'URL existe est de vérifier si le serveur répond et si le code de retour n'est pas 404. C'est ce que fait le code suivant.
require "net/http"
def url_exist?(url_string)
url = URI.parse(url_string)
req = Net::HTTP.new(url.host, url.port)
req.use_ssl = (url.scheme == 'https')
path = url.path if url.path.present?
res = req.request_head(path || '/')
res.code != "404" # false if returns 404 - not found
rescue Errno::ENOENT
false # false if can't find the server
end
2. Vérifiez si vous demandez l'URL correctement
Cependant, La plupart du temps, nous ne sommes pas intéressés par l'existence d'une URL, mais par le fait de pouvoir y accéder. . Heureusement, en regardant le Codes d'état HTTP familles, c'est le 4xx
qui indique une erreur du client (donc une erreur de votre part, ce qui signifie que vous ne demandez pas la page correctement, que vous n'avez pas la permission ou autre). C'est une bonne liste d'erreurs pour vérifier si vous pouvez accéder à cette page. De wiki :
La classe de code d'état 4xx est destinée aux cas où le client semble avoir commis une erreur. Sauf lorsqu'il répond à une demande HEAD, le serveur doit inclure une entité contenant une explication de la situation d'erreur, et préciser s'il s'agit d'une condition temporaire ou permanente. Ces codes d'état sont applicables à toute méthode de demande. Les agents utilisateurs doivent afficher toute entité incluse à l'utilisateur.
Ainsi, le code suivant Assurez-vous que l'URL existe et que vous pouvez y accéder. :
require "net/http"
def url_exist?(url_string)
url = URI.parse(url_string)
req = Net::HTTP.new(url.host, url.port)
req.use_ssl = (url.scheme == 'https')
path = url.path if url.path.present?
res = req.request_head(path || '/')
if res.kind_of?(Net::HTTPRedirection)
url_exist?(res['location']) # Go after any redirect and make sure you can access the redirected URL
else
res.code[0] != "4" #false if http code starts with 4 - error on your side.
end
rescue Errno::ENOENT
false #false if can't find the server
end
3. Vérifiez si vous pouvez le demander correctement et si le serveur peut y répondre correctement.
Tout comme le 4xx
vérifie si vous pouvez accéder à l'URL, la famille 5xx
La famille vérifie si le serveur a eu des difficultés à répondre à votre demande. La plupart du temps, une erreur dans cette famille est due à des problèmes sur le serveur lui-même, et nous espérons qu'ils sont en train de les résoudre. Si Vous devez être en mesure d'accéder à la page et d'obtenir une réponse correcte maintenant. vous devez vous assurer que la réponse ne provient pas de 4xx
o 5xx
et si vous avez été redirigé, la page redirigée répond correctement. De manière très similaire à (2), vous pouvez simplement utiliser le code suivant :
require "net/http"
def url_exist?(url_string)
url = URI.parse(url_string)
req = Net::HTTP.new(url.host, url.port)
req.use_ssl = (url.scheme == 'https')
path = url.path if url.path.present?
res = req.request_head(path || '/')
if res.kind_of?(Net::HTTPRedirection)
url_exist?(res['location']) # Go after any redirect and make sure you can access the redirected URL
else
! %W(4 5).include?(res.code[0]) # Not from 4xx or 5xx families
end
rescue Errno::ENOENT
false #false if can't find the server
end
0 votes
Vous devriez lire cet article : Validation des URL/URI en Ruby on Rails
9 votes
La question était suffisamment bonne pour correspondre à ma recherche google et les réponses sont précieuses
0 votes
Je suis d'accord. Cette question est utile.
1 votes
Je pense que c'est une bonne question avec des réponses utiles. La raison pour laquelle elle a été fermée ("doit démontrer une compréhension minimale") n'est plus valable sur l'OS. J'ai modifié la question pour ajouter quelques exemples. Avec cela, je pense que la question peut être réouverte maintenant.
0 votes
Veuillez voter
reopen
si vous pensez que cette question est bonne. 4 personnes supplémentaires sont nécessaires pour rouvrir cette question. Je veux poster une réponse tenant compte de la redirection.