+
36
-

回答

方法一:直接连接到 IP 地址并设置 Host 请求头

这是最直接、最常用的方式,适用于 HTTP 和 HTTPS(需谨慎处理 SSL 证书)。

将请求的 URL 替换为指定的 IP 圾址。

在请求头中设置 Host 字段为原始域名。

示例代码(HTTP):

import requests

domain = "example.com"
ip = "93.184.216.34"

headers = {
    "Host": domain
}

response = requests.get(f"http://{ip}", headers=headers)
print(response.text)

示例代码(HTTPS,需处理证书):

import requests

domain = "example.com"
ip = "93.184.216.34"

headers = {
    "Host": domain
}

response = requests.get(f"https://{ip}", headers=headers, verify=False)
print(response.text)
注意:verify=False 会跳过 SSL 证书验证,存在安全风险,仅用于测试环境 。生产环境中应确保证书与目标 IP 匹配。

方法二:使用猴子补丁(Monkey Patch)修改 DNS 解析

通过修改 socket.getaddrinfo 的行为,让特定域名始终解析为指定的 IP 地址。

替换 socket.getaddrinfo 函数。在函数中判断请求的域名,若匹配则返回指定 IP。示例代码:
import socket
import requests

domain = "example.com"
ip = "93.184.216.34"

# 保存原始的 getaddrinfo 函数
_original_getaddrinfo = socket.getaddrinfo

def _getaddrinfo(host, port, *args, **kwargs):
    if host == domain:
        return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (ip, port))]
    else:
        return _original_getaddrinfo(host, port, *args, **kwargs)

# 打猴子补丁
socket.getaddrinfo = _getaddrinfo

# 发起请求,域名会解析到指定 IP
response = requests.get(f"http://{domain}")
print(response.text)

该方法适用于所有基于 socket 的 DNS 解析(包括 requests)。

可以精确控制哪些域名被重定向。

适用于 HTTP 和 HTTPS,但 HTTPS 仍需注意证书问题(同方法一)。

不推荐的方法:修改系统 hosts 文件

虽然可行,但存在以下问题:

需要管理员权限。

影响全局网络请求,不够灵活。

不适合自动化脚本或部署。

网友回复

我知道答案,我要回答