2011-02-01 15 views
17

यदि http://foo.com1.2.3.4 पर रीडायरेक्ट करता है जो तब http://finalurl.com पर रीडायरेक्ट करता है, तो मैं लैंडिंग यूआरएल "http://finalurl.com" को खोजने के लिए रूबी का उपयोग कैसे कर सकता हूं?रुबी का उपयोग करके रीडायरेक्ट के बाद मैं अंतिम यूआरएल कैसे प्राप्त कर सकता हूं?

+0

काम किया तो हम बता सकते हैं कि तुम क्या HTTP क्लाइंट का उपयोग कर रहे हैं कृपया कुछ नमूना कोड दिखा। –

+0

मैंने अंतिम रीडायरेक्ट यूआरएल प्राप्त करने के लिए [final_redirect_url] (https://rubygems.org/gems/final_redirect_url) मणि का उपयोग किया था। यह स्ट्रिंग के रूप में अंतिम यूआरएल देता है। – Indyarocks

उत्तर

22

वे दो तरीके है, दोनों HTTPClient और 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

httpc.get (URL) के बजाय httpc.head (URL) का उपयोग करना बेहतर है। यह पूरी साइट को लोड होने से रोकता है। – cavneb

+1

सहमत हैं, * अगर * मेजबान एक हेड पर रीडायरेक्ट कर सकता/सकती है। मैंने HEAD प्रतिक्रियाएं देखी हैं जो बिना किसी रीडायरेक्ट के त्रुटि दिखाती हैं। मुझे लगता है कि ऐसा इसलिए है क्योंकि एक सिर अधिक खोजी है। और यह व्यवहार कुछ HTTPd और मानकों, या संस्करणों के लिए अलग हो गया हो सकता है, इसलिए यह अब कोई मुद्दा नहीं है। –

+0

मैंने http, कर्ल और खुली विधियों की तुलना की और परिणाम काफी असंगत हैं। कुछ यूआरएल के लिए परिणाम देते हैं जिसके लिए अन्य नहीं करते हैं। मैं इस बात को लेकर आश्चर्यचकित हूं कि इस संगत होने के लिए वेब ब्राउजर कितने अलग-अलग मामलों को कवर करता है। काश मैं रूबी के लिए वही था। –

0

मैं रूबी उपयोगकर्ता का अधिक नहीं हूं, लेकिन मूलभूत रूप से आपको जो चाहिए वह HTTP शीर्षकों की व्याख्या करने के लिए कुछ है। निम्नलिखित पुस्तकालय है कि ऐसा करने के लिए प्रकट होता है: "। निम्नलिखित रीडायरेक्शन"

http://www.ensta.fr/~diam/ruby/online/ruby-doc-stdlib/libdoc/net/http/rdoc/classes/Net/HTTP.html

करने के लिए नीचे जाएं

3

एक और तरीका है, 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

यह विश्वसनीय रूप से काम नहीं करता है। –

1

मैं अपने जरूरत के लिए एक RequestResolver को लागू किया है:

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

यह नेट :: HTTP का उपयोग करता है, और एकाधिक रीडायरेक्ट का पालन करता है। यह सापेक्ष रीडायरेक्ट को भी संभालता है। यह मेरी सरल आवश्यकता के लिए था ताकि बग हो। यदि आप एक खोजते हैं तो कृपया मुझे बताएं।

1

JRuby के लिए इस

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 
संबंधित मुद्दे

 संबंधित मुद्दे