python请求 - 删除重定向上的标头

时间:2015-05-15 09:49:56

标签: python http redirect http-headers python-requests

我正在使用python请求库对应用程序进行一些http检查。我有一种情况,我需要在请求上发送一个初始主机头,但是在跟踪导致问题的重定向时不应该使用它。

我已经浏览了请求文档,但是我无法看到在关注重定向时我可以请求删除请求标头的方法。

这是我的问题的一个例子

import requests
from requests.structures import CaseInsensitiveDict

s = requests.Session()
request_headers = CaseInsensitiveDict()
request_headers['host'] = 'google.co.uk'

response = s.get("http://google.co.uk",allow_redirects=True,headers=request_headers)

在这种情况下,google.co.uk会重定向到https://www.google.co.uk,但会陷入循环,因为即使在重定向之后,它也会将主机标头设置为“google.co.uk”。

我总是需要在第一个请求上使用手动主机头,因为这会通过CDN使用标头来确定它所服务的网站。从初始请求中删除它不是一种选择。

这是一个等效的curl,它会在初始请求之后删除主机头。这是我希望从Python请求中看到/期望的行为

curl -H "Host: google.co.uk" http://google.co.uk -L -o /dev/null 

2 个答案:

答案 0 :(得分:1)

curl不会丢弃Host标头。它发送第二个请求,标题为Host: www.google.co.uk(从重定向指向的URL创建)。

正如钟宇所写,你不需要指定主机头。因此,如果您的目标只是下载页面,那么解决方案就是省略headers参数:

 response = s.get("http://google.co.uk",allow_redirects=True)

但如果你的目标是某些http检查,可能这将是解决方案:

import requests

resp = requests.get("http://google.co.uk",allow_redirects=False)
while resp.status_code == 301:
    resp = requests.get(resp.headers['location'],allow_redirects=False)

答案 1 :(得分:0)

非常晚的答复。我只是碰到这篇文章,寻找其他东西。 它可以帮助某人寻找答案。

查看请求的“挂钩”机制,您可以在响应返回时指定一个回调(每个响应都将调用您的挂钩): https://2.python-requests.org/en/master/user/advanced/#event-hooks

从回调中,您将能够删除/修改/添加标头(盲目地或在状态码为3xx或...时)。