Wednesday, March 10, 2010

自己的域名与Blogger

通过自己的域名(如本人使用blog.jessinio.info)去访问自己的Blogger内容, 早就是这样使用的了。
但是没有理会其中的具体细节。

今天在看DNS方面的知识时, 突然就对这个问题感兴趣了。提出这一个问题:为什么使用blog.jessinio.info可以访问blogger的内容?

下面做一下测试, 随便玩一下。
本人的blog.jessinio.info通过browser是可以访问的。这也是Blogger的内容。看一下是什么:
jessinio@jessinio-laptop:~$ ping blog.jessinio.info
PING ghs.you8g.com (69.164.192.240) 56(84) bytes of data.
64 bytes from li107-240.members.linode.com (69.164.192.240): icmp_seq=1 ttl=49 time=303 ms
64 bytes from li107-240.members.linode.com (69.164.192.240): icmp_seq=2 ttl=49 time=304 ms

网络是通的, 也很正常, 就是对应着一个IP地址。但是一个很神奇的事情:在browser的地址栏中直接访问上面的IP地址是得不到blogger的内容的:

Not Found

The requested URL / was not found on this server.

* 可以亲自试一试: http://69.164.192.240/

先看一下ping命令的結果是什么意思:

0. blog.jessinio.info,本人创建的一个CNAME记录
1. ghs.you8g.com, 也是一个CNAME记录,指向的ANAME记录
2. li107-240.members.linode.com,所谓的正规主机名,也为ANAME
* http://tools.ietf.org/html/rfc1034并没有明文规定禁止CNAME指向CNAME。只是建议避免这种情况

这是为什么直指访问IP地址得不到blogger的内容呢? 难道是因为blog.jessinio.info是一个CNAME的问题?其实这一想法是被pass掉的。browser发出的請求怎么可能包括CNAME之类的信息的嘛

browser的请求明显还包括一个信息: Host

为了求证这一点, 自己写了段请求代码, 因为为了看清請求的具体情况, 代码是直接使用socket写的:
import socket
import re
import os
import sys 


if __name__ == "__main__":
  blog_ip = socket.gethostbyname("blog.jessinio.info")
  s = socket.socket()
  s.connect((blog_ip,80))
  s.sendall("""GET / HTTP/1.1
Host: blog.jessinio.info
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7



""")
  data = ''
  while True:
    retval = s.recv(1024)
    if not retval: break
    data += retval
  s.close()
  # 第一个空行开始的内容都是browser需要的内容
  d = re.search(r'(\r\n|\n)\1(.*)', data, re.S).group(2)
  f = open("/tmp/blog.gz", "w")
  f.write(d)
  f.close()
* 得到的"/tmp/blog.gz"是一个gzip文件, 可以使用gunzip解压一看就明白

从代码可以看到, 访问IP之所以不行, 是因为ghs.google.com需要得到請求中Host参数

注意: 要想使用自己的域名去访问blogger是需要在blogger后台里配置的, 这一配置才能使ghs.google.com根据不同的Host值得到不出的blogger帐号

1 comment:

Note: Only a member of this blog may post a comment.