我正在使用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,cdn使用头来确定它所服务的站点。从初始请求中删除它不是一个选项。
这里有一个等价的curl,它在初始请求之后删除主机头。这是我希望从python请求中看到/期望的行为
curl -H "Host: google.co.uk" http://google.co.uk -L -o /dev/null
最佳答案
curl不会删除主机头。它用头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)