2011-02-01 22 views
17

Si http://foo.com redirige a 1.2.3.4 y luego lo redirecciona a http://finalurl.com, ¿cómo puedo usar Ruby para averiguar la URL de destino "http://finalurl.com"?¿Cómo puedo obtener la URL final después de los redireccionamientos con Ruby?

+0

favor mostrar algunos ejemplos de código para que podamos decir lo HTTP cliente que está utilizando. –

+0

Utilicé [final_redirect_url] (https://rubygems.org/gems/final_redirect_url) gema para obtener la url redireccionada final. Simplemente devuelve la URL final como cadena. – Indyarocks

Respuesta

22

Aquí hay dos maneras, utilizando tanto HTTPClient y Open-URI:

require 'httpclient' 
require 'open-uri' 

URL = 'http://www.example.org' 

httpc = HTTPClient.new 
resp = httpc.get(URL) 
puts resp.header['Location'] 
>> http://www.iana.org/domains/example/ 

open(URL) do |resp| 
    puts resp.base_uri.to_s 
end 
>> http://www.iana.org/domains/example/ 
+1

Es mejor usar httpc.head (URL) en lugar de httpc.get (URL). Esto evita que todo el sitio se cargue. – cavneb

+1

De acuerdo, * SI * el host podría/podría hacer un redireccionamiento en una CABEZA. He visto respuestas HEAD que muestran un error sin redirección. Creo que es porque HEAD es más exploratorio. Y ese comportamiento podría haberse aislado a cierto HTTPd y los estándares, o versiones, cambiaron por lo que ya no es un problema. –

+0

Comparé los métodos http, curl y open y los resultados son bastante inconsistentes. Algunos dan resultados para las URL que otros no. Estoy empezando a preguntar cuántos casos diferentes cubre un navegador web para que esto sea coherente. Ojalá tuviera lo mismo para Ruby. –

3

Otra forma, utilizando Curb:

def get_redirected_url(your_url) 
    result = Curl::Easy.perform(your_url) do |curl| 
    curl.follow_location = true 
    end 
    result.last_effective_url 
end 
+1

Esto no funciona de manera confiable. –

1

me han implementado un RequestResolver para mi necesidad:

https://gist.github.com/lulalala/6be104641bcb60f9d0e8

Utiliza Net :: HTTP y sigue múltiples redireccionamientos. También maneja redirecciones relativas. Fue por mi simple necesidad, entonces puedo tener errores. Si descubres uno, dímelo.

1

para JRuby Esto funcionó

def get_final_url (url) 
    final_url = "" 
    until url.nil? do 
     final_url = url 
     url = Net::HTTP.get_response(URI.parse(url))['location'] 
    end 

    final_url 
    end 
Cuestiones relacionadas