为什么我的主机标头不起作用?

时间:2014-03-21 01:29:54

标签: python

我正在尝试为网络服务器写一个中间人(为了增加额外的服务,而不是出于各种原因。

我正在尝试传递一个Host标题,因为后端在{$ 1}}标题中提取了它的地址。不可预知的地方。

原始代码是数百行,所以我把它简化为这里的显着部分。

Host

当我运行此代码时,我希望将import urllib2 opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1)) opener.addheaders.append(('Host','fakedomain.net')) res = opener.open('http://www.google.com/doodles/finder/2014/All%20doodles') res.read() 传递给Google的服务器。但是,调试代码清楚地显示Host: fakedomain.net。将Host: www.google.com\r\n更改为Host可以正常工作。

使用开启者发送HostX标头的正确方法是什么?

注意:这是一种简化;在实际代码中,我指向我自己的服务器等 - 这是一个简化。

2 个答案:

答案 0 :(得分:3)

使用urllib2.Request

import urllib2

opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1))
req = urllib2.Request('http://www.google.com/doodles/finder/2014/All%20doodles')
req.add_unredirected_header('Host', 'fakedomain.net')
res = opener.open(req)
res.read()

答案 1 :(得分:0)

感谢Satoru让我走上了正确的轨道,几乎就是我想要的,并且肯定让我走上了正确的轨道。

正确答案是:

import urllib2

opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1))

req = urllib2.Request('http://www.google.com/doodles/finder/2014/All%20doodles',None,{"Host":"fakedomain.net"})

res = opener.open(req)

res.read()

对不起Satoru,我不想选择你的答案是正确的,以防其他人发现我的问题,但我已经投了赞成票。