获取没有HTML的URL标头

时间:2010-11-30 15:39:42

标签: ruby-on-rails http

有点奇怪的问题。有没有办法让网络服务器只返回标题而不是HTML本身?

我想问服务器一个URL,看看它是否有效(不是404/500 /等)并遵循重定向(如果存在)但不能获得实际的HTML内容。

由于

  • 最好在Ruby中执行此操作

5 个答案:

答案 0 :(得分:5)

使用HEAD代替GET或POST

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html第9.4节

答案 1 :(得分:2)

按照建议,检查Net :: HTTP库..

require 'net/http'
Net::HTTP.new('www.twitter.com').request_head('/').class

答案 2 :(得分:1)

这正是 HEAD HTTP方法所做的。

对于Ruby,有一个漂亮的宝石,比低级net / http简单得多,它允许你执行 HEAD 请求。

gem install rest-open-uri

然后

irb> require 'rubygems'
=> true
irb> require 'rest-open-uri'
=> true
irb> sio = open("http://stackoverflow.com", :method => :head)
=> #
irb> sio.meta
=> {"expires"=>"Tue, 30 Nov 2010 18:08:47 GMT", "last-modified"=>"Tue, 30 Nov 2010 18:07:47 GMT", "content-type"=>"text/html; charset=utf-8", "date"=>"Tue, 30 Nov 2010 18:08:27 GMT", "content-length"=>"193779", "cache-control"=>"public, max-age=18", "vary"=>"*"}
irb> sio.status
=> ["200", "OK"]

遵循重定向。当主机不存在时,您必须为SocketError提供救援,如果文件不存在,则必须为OpenURI :: HTTPError提供救援。

如果您想要更强大的内容,请查看MechanizeHTTParty

答案 3 :(得分:0)

使用Ruby的net / http和Mak提到的HEAD方法。从命令行检查ri Net::HTTP#head以获取信息。

答案 4 :(得分:0)

实际上我不得不将pantulis的答案折叠成我自己的答案。似乎有两种网址都没有fns单独工作所以我做了

module URI

  def self.online?(uri)
    URI.exists?(uri)
  end

  def self.exists?(uri)
    URI.exists_ver1?(uri)
  end

  def self.exists_ver1?(url)
    @url = url
    ["http://", "https://"].each do |prefix|
      url = url.gsub(prefix, "")
    end

    begin
      code = Net::HTTP.new(url).request_head('/').code
      [2,3].include?(code.to_i/100)
    rescue
      URI.exists_ver2?(@url)
    end
  end


  def self.exists_ver2?(url)
    url = "http://#{url}" if URI.parse(url).scheme.nil?
    return false unless URI.is_a?(url)
    uri = URI(url)
    begin
      request = Net::HTTP.new uri.host
      response= request.request_head uri.path
      #http status code 200s and 300s are ok, everything else is an error
      [2,3].include? response.code.to_i/100
    rescue
      false
    end
  end
end