3

我有一个大约 150 个 URL 的列表。我需要找出每个域是否解析www.domain.comdomain.com.

4

3 回答 3

5

域名可以通过多种方式“解析”或“重定向”到另一个:

  1. 发出 HTTP 请求foo.com可能会使用301 之类的HTTP 重定向响应代码www.foo.com进行响应,将浏览器发送到.

    phrogz$ curl -I http://adobe.com
    HTTP/1.1 301 Moved Permanently
    Date: Mon, 30 Apr 2012 22:19:33 GMT
    Server: Apache
    Location: http://www.adobe.com/
    Content-Type: text/html; charset=iso-8859-1
    
  2. 服务器发回的网页可能包含<meta>重定向

    <meta http-equiv="refresh" content="0; url=http://www.adobe.com/">
    
  3. 服务器发回的网页可能包含 JavaScript 重定向:

    location.href = 'http://www.adobe.com';
    

您需要测试哪些?

读取 HTTP 响应标头

要检测 #1,请使用Ruby 内置的net/http库:

require "net/http"
req = Net::HTTP.new('adobe.com', 80)
response = req.request_head('/')
p response.code, response['Location']
#=> "301"
#=> "http://www.adobe.com/"

阅读 HTML 元标题

要检测 #2,您需要实际获取页面、解析它并查看内容。我会为此使用 Nokogiri:

require 'open-uri' # …if you don't need #1 also, this is easier
html = open('http://adobe.com').read

require 'nokogiri'
doc = Nokogiri.HTML(html)
if meta = doc.at_xpath('//meta[@http-equiv="refresh"]')
  # Might give you "abobe.com" or "www.adobe.com"
  domain = meta['content'][%r{url=([^/"]+(\.[^/"])+)},1]
end

阅读 JavaScript

……你一个人,在这里。:) 您可以尝试自己解析 JavaScript 代码,但您需要实际运行 JS 以了解它是否真的重定向到另一个页面。

于 2012-04-30T22:23:53.230 回答
2

机械化方式:

require 'mechanize'
Mechanize.new.head('http://google.com').uri.host
#=> "www.google.com.ph"
于 2012-05-01T01:42:52.640 回答
2

我已经看到使用resolv std library非常成功地完成了这项工作。

require 'resolv'
["google.com", "ruby-lang.org"].map do |domain|
  [domain, Resolv.getaddress(domain)]
end
于 2012-04-30T21:21:31.643 回答