2010-11-30 35 views
0

有點奇怪的問題。有沒有辦法讓web服務器只返回頭文件而不是HTML本身?獲取不含HTML的URL標題

我想問一個服務器的URL,看看它的有效(不是404/500/etc),並按照重定向(如果存在),但沒有得到實際的HTML內容。

感謝

  • 最好辦法做到這在Ruby中

回答

1

這正是HEAD HTTP方法做。

對於Ruby,有一個美麗的寶石,比低級網絡/ 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

0

使用Ruby的淨/ HTTP和麥提到的HEAD方法。有關信息,請從命令行檢查ri Net::HTTP#head

2

至於建議,檢查的Net :: HTTP庫..

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

我一直在摔跤這一段時間,這是我見過的最乾淨的答案 – dabobert 2015-05-22 17:34:22

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