Lo siento por la respuesta tardía en esto, pero creo que este deservers una mejor respuesta.
Hay tres maneras de ver esta pregunta:
- control estricto si la URL existe
- Comprobar si está solicitando el correclty URL
- Comprobar si se puede solicitar de manera correcta y el servidor puede responder correctamente
1. estricto control si existe la URL
Mientras que 200
significa que el servidor responde a esa URL (por lo tanto, la URL existe), responder a otro código de estado no significa que la URL no existe. Por ejemplo, al responder 302 - redirected
, significa que la URL existe y está redireccionando a otra.Durante la navegación, 302
muchas veces se comporta igual que 200
para el usuario final. Otro código de estado que se puede devolver si existe una URL es 500 - internal server error
. Después de todo, si la URL no existe, ¿cómo es que el servidor de aplicaciones procesó su solicitud en su lugar devuelve simplemente 404 - not found
?
Así que en realidad sólo hay uno dos casos en los que no existe una URL: Cuando el servidor no existe o cuando existe el servidor, pero no puede encontrar la ruta URL dado no existe. Por lo tanto, la única manera de comprobar si existe la URL está comprobando si el servidor responde y el código de retorno no es 404. El siguiente código hace exactamente eso.
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. Comprobar si está solicitando la URL correclty
Sin embargo, mayoría de las veces no estamos interesados en ver si existe una dirección URL, pero si podemos acceder a él. Afortunadamente mirando a las familias HTTP status codes, que es la familia 4xx
, que establece por error del cliente (por lo tanto, un error en su lado, lo que significa que no está solicitando la página correctamente, no tienen permiso o en absoluto). Esta es una buena cantidad de errores para verificar si puede acceder a esta página. De wiki:
The 4xx class of status code is intended for cases in which the client seems to have erred. Except when responding to a HEAD request, the server should include an entity containing an explanation of the error situation, and whether it is a temporary or permanent condition. These status codes are applicable to any request method. User agents should display any included entity to the user.
Así que el código siguiente Asegúrese de que existe la URL y se puede acceder a él:
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. Comprobar si se puede solicitar de manera correcta y el servidor puede responder correctamente
Al igual que la familia 4xx
comprueba si puede acceder a la URL, la familia 5xx
comprueba si el servidor tuvo algún problema para responder a su solicitud. Un error en esta familia la mayoría de las veces se debe a problemas en el servidor, y con suerte están trabajando para resolverlo. Si Tienes que ser capaz de acceder a la página y obtener una respuesta correcta ahora, usted debe asegurarse de que la respuesta no es de 4xx
o 5xx
familia, y si se redirigió, las respuestas a páginas redirigidas correctamente. Tanto es similar a (2), sólo tiene que utilizar el siguiente código:
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
pregunta era lo suficientemente bueno para que coincida con mi búsqueda de google y respuestas son valiosas – kranzky
estoy de acuerdo. Esta pregunta es útil. –
Creo que esta es una buena pregunta con respuestas útiles. La razón por la que fue cerrada ("debe demostrar una comprensión mínima") ya no es válida en SO. He editado la pregunta para agregar algunos ejemplos. Con eso, creo que la pregunta puede ser reabierta ahora. –