我已经编写了一段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)。
有人知道为什么会这样吗?这让我疯了!
感谢。
答案 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