2011-02-01 36 views
17

Nếu http://foo.com chuyển hướng đến 1.2.3.4 sau đó chuyển hướng đến http://finalurl.com, làm cách nào tôi có thể sử dụng Ruby để tìm URL đích "http://finalurl.com"?Làm thế nào tôi có thể nhận được URL cuối cùng sau khi chuyển hướng bằng Ruby?

+0

Hãy thể hiện một số mẫu mã vì vậy chúng tôi có thể cho biết những gì HTTP khách hàng mà bạn đang sử dụng. –

+0

tôi sử dụng [final_redirect_url] (https://rubygems.org/gems/final_redirect_url) đá quý để có được url chuyển thức. Nó chỉ trả về URL cuối cùng dưới dạng chuỗi. – Indyarocks

Trả lời

22

Dưới đây là hai cách, sử dụng cả hai HTTPClientOpen-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

Tốt hơn nên sử dụng httpc.head (URL) thay vì httpc.get (URL). Điều này ngăn không cho toàn bộ trang web tải. – cavneb

+1

Đồng ý, * NẾU * máy chủ sẽ/có thể thực hiện chuyển hướng trên HEAD. Tôi đã thấy các phản hồi CHÍNH hiển thị lỗi không có chuyển hướng. Tôi nghĩ rằng đó là bởi vì một HEAD là khám phá nhiều hơn. Và hành vi đó có thể đã bị cô lập đối với một số HTTPd và các tiêu chuẩn, hoặc các phiên bản nhất định, thay đổi để nó không còn là vấn đề nữa. –

+0

Tôi so sánh http, curl và các phương thức mở và kết quả là không nhất quán. Một số cho kết quả cho các url mà những người khác thì không. Tôi bắt đầu tự hỏi có bao nhiêu trường hợp khác nhau mà trình duyệt web đề cập đến để có được sự nhất quán này. Tôi ước tôi có cùng một viên hồng ngọc. –

3

Một cách khác, sử dụng 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

Điều này không hoạt động đáng tin cậy. –

1

tôi đã thực hiện một RequestResolver cho nhu cầu của tôi:

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

Nó sử dụng Net :: HTTP và theo nhiều chuyển hướng. Nó cũng xử lý các chuyển hướng tương đối. Đó là vì nhu cầu đơn giản của tôi nên có thể có lỗi. Nếu bạn phát hiện ra một xin vui lòng cho tôi biết.

1

cho JRuby này làm việc

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 
Các vấn đề liên quan