有點奇怪的問題。有沒有辦法讓web服務器只返回頭文件而不是HTML本身?獲取不含HTML的URL標題
我想問一個服務器的URL,看看它的有效(不是404/500/etc),並按照重定向(如果存在),但沒有得到實際的HTML內容。
感謝
- 最好辦法做到這在Ruby中
有點奇怪的問題。有沒有辦法讓web服務器只返回頭文件而不是HTML本身?獲取不含HTML的URL標題
我想問一個服務器的URL,看看它的有效(不是404/500/etc),並按照重定向(如果存在),但沒有得到實際的HTML內容。
感謝
這正是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。
使用HEAD代替GET或POST
使用Ruby的淨/ HTTP和麥提到的HEAD方法。有關信息,請從命令行檢查ri Net::HTTP#head
。
至於建議,檢查的Net :: HTTP庫..
require 'net/http'
Net::HTTP.new('www.twitter.com').request_head('/').class
實際上我不得不將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
我一直在摔跤這一段時間,這是我見過的最乾淨的答案 – dabobert 2015-05-22 17:34:22