Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Ruby重定向后,如何获取最终URL?_Ruby_Networking_Redirect_Url Routing - Fatal编程技术网

使用Ruby重定向后,如何获取最终URL?

使用Ruby重定向后,如何获取最终URL?,ruby,networking,redirect,url-routing,Ruby,Networking,Redirect,Url Routing,如果http://foo.com重定向到1.2.3.4,然后重定向到http://finalurl.com,如何使用Ruby查找登录URL“http://finalurl.com“?我不是一个Ruby用户,但您基本上需要的是一些解释HTTP头的东西。以下库似乎可以执行此操作: 跳到“以下重定向”。这里有两种方法,同时使用和: 另一种方法,使用: 我已根据自己的需要实现了RequestResolver: 它使用Net::HTTP,并遵循多个重定向。它还处理相对重定向。 这是为了我的简单需要,所

如果
http://foo.com
重定向到
1.2.3.4
,然后重定向到
http://finalurl.com
,如何使用Ruby查找登录URL“http://finalurl.com“?

我不是一个Ruby用户,但您基本上需要的是一些解释HTTP头的东西。以下库似乎可以执行此操作:


跳到“以下重定向”。

这里有两种方法,同时使用和:

另一种方法,使用:


我已根据自己的需要实现了RequestResolver:

它使用Net::HTTP,并遵循多个重定向。它还处理相对重定向。
这是为了我的简单需要,所以可能会有bug。如果你发现了一个,请告诉我。

对于
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

请显示一些示例代码,这样我们就可以知道您使用的是什么HTTP客户端。我使用gem获得最终重定向的url。它只是以字符串形式返回最终URL,最好使用httpc.head(URL)而不是httpc.get(URL)。这将阻止整个站点加载。同意,如果主机将/可以对头部执行重定向。我已经看到头部的反应显示了一个没有重定向的错误。我想那是因为头部更具探索性。这种行为可能已经被隔离到特定的HTTPd中,标准或版本也发生了变化,因此不再是问题。我比较了http、curl和open方法,结果相当不一致。有些人会给出URL的结果,而其他人则不会。我开始想知道一个web浏览器覆盖了多少种不同的情况来实现这种一致性。我希望我对ruby也有同样的想法。@JacksonHenley你能给出一些url示例,它会给出不一致的结果吗?浏览器会做很多修正,从如何处理坏的url到坏的HTML。他们的目标是将一些东西归还给用户,即使它被损坏了,因为用户的大脑可能会从中收集到一些有用的东西。这与cURL、Open::URI等工具不同。它们必须具有准确和正确的URL。像Nokogiri这样的解析器需要正确的HTML和XML。Nokogiri确实做了一些修正,试图返回正确解析的内容,但有时它得到了错误的修正,我们必须在Nokogiri获得数据之前进行干预,然后我们修正并传递数据。
def get_redirected_url(your_url)
  result = Curl::Easy.perform(your_url) do |curl|
    curl.follow_location = true
  end
  result.last_effective_url
end 
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