当我知道它是301时,Net :: HTTP返回404

时间:2012-10-04 23:18:44

标签: ruby net-http

我已经编写了一段Ruby代码,用于跟踪一系列潜在的重定向,直到它到达最终的URL:

def self.obtain_final_url_in_chain url
  logger.debug "Following '#{url}'"
  uri = URI url
  http = Net::HTTP.start uri.host, uri.port
  response = http.request_head url 
  case response.code
  when "301"
    obtain_final_url_in_chain response['location']
  when "302"
    obtain_final_url_in_chain response['location']
  else
    url
  end
end

您使用网址调用obtain_final_url_in_chain,最终应返回最终网址。

我正在尝试使用此网址:http://feeds.5by5.tv/master

根据http://web-sniffer.net/,由于301重定向,应将其重定向到http://5by5.tv/rss。相反,虽然我得到http://feeds.5by5.tv/master的404。

上面的代码为其他网址返回200(例如http://feeds.feedburner.com/5by5video)。

有人知道为什么会这样吗?这让我疯了!

感谢。

1 个答案:

答案 0 :(得分:2)

根据docs for Net::HTTP#request_head,您要传递路径,而不是完整的网址作为第一个参数。

通过这些以及其他一些更改,这是重写方法的一种方法:

def obtain_final_url_in_chain(url)
  uri = URI url
  response = Net::HTTP.start(uri.host, uri.port) do |http|
    http.request_head uri.path
  end

  case response
  when Net::HTTPRedirection
    obtain_final_url_in_chain response['location']
  else
    url
  end
end