Mat*_*t.C 3 networking dns python
我正在尝试完成此任务,我有一个 IP,并且我想使用该 IP 发出 HTTP 请求。
假设我有 stackoverflow.com IP (151.101.193.69) 并且我想使用该requests
模块使用 python 在网站上发出 HTTP 请求。我写了这段代码
import requests
response = requests.get("http://151.101.193.69:80")
response.text
Run Code Online (Sandbox Code Playgroud)
返回页面的html代码。这样做我得到一个页面,上面写着
Fastly error: unknown domain: 151.101.193.69. Please check that this domain has been added to a service.
Details: cache-mxp19846-MXP
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用 Google IP 执行此操作,则它可以工作并且请求会返回 Google 主页
import requests
response = requests.get("http://216.58.205.174:80")
response.text
Run Code Online (Sandbox Code Playgroud)
是的,这很正常。
HTTP 请求始终包含一个“Host:”标头,指示 URL 中实际使用的名称。例如,访问http://superuser.com
将发送一个标头Host: superuser.com
;如果您正在使用http://151.101.193.69
,标题当然会显示Host: 151.101.193.69
(甚至完全不存在)。
重要的一点是,许多 HTTP 服务器为许多不同的域(也称为虚拟主机)共享相同的 IP 地址,并且它们依赖此标头来了解您尝试访问的域。
例如,所有Stack Exchange 域 – superuser.com
, stackoverflow.com
, serverfault.com
, diy.stackexchange.com
, ... – 共享完全相同的 IP 地址集。网络服务器区分所有这些网站的唯一方法是查看“主机”HTTP 标头。
(此外,这些地址实际上属于 Fastly CDN,而不是真正的网络服务器。大型 CDN,例如 Fastly 或 CloudFlare,可能对来自不同客户的数百个域使用相同的 IP 地址。)
最后,由服务器决定它将如何处理它无法识别的“主机”标头。一些服务器返回一个错误页面,其他服务器返回他们拥有的“第一个”域。
因此,为了成功发出请求,您需要执行以下操作:
requests.get("http://151.101.193.69", headers={"Host": "stackoverflow.com"})
Run Code Online (Sandbox Code Playgroud)
但这是一种愚蠢的说法requests.get("http://stackoverflow.com")
。您可能需要此方法的唯一时间是当您的 IP 地址与 DNS 信息不匹配时(例如,如果您试图绕过 DNS)。
(而且一旦您尝试访问 HTTPS 网站,它就会给您带来更多问题,因为 URL 中的域也用于检查 TLS 证书。)
归档时间: |
|
查看次数: |
21867 次 |
最近记录: |