但是没有理会其中的具体细节。
今天在看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帐号
It works so fine.
ReplyDelete