使用sshtunnel与Python通过SSH隧道请求HTTP返回结果异常的问题
问题原因
核心差异源于HTTP请求缺少正确的Host头:
- 远程服务器执行
curl www.google.com时,curl会自动添加Host: www.google.com请求头,Google服务器能识别该域名并返回对应页面。 - 你的Python代码请求
http://localhost:8888/时,requests默认发送Host: localhost:8888,Google服务器无法匹配到对应站点资源,因此返回404错误。
修复方案
修改requests.get请求,手动添加Host请求头指定为www.google.com即可:
with sshtunnel.open_tunnel( (remote_server, 22), ssh_username="process", ssh_host_key=ssh_host_key, remote_bind_address=('www.google.com', 80), local_bind_address=('', 8888) ) as tunnel: url = f'http://localhost:{8888}/' # 添加Host头模拟直接请求www.google.com的请求格式 headers = {'Host': 'www.google.com'} response = requests.get(url, headers=headers) print(response.text)
另一种可选方式是修改请求URL的主机部分为www.google.com,通过本地隧道端口访问(需确保本地DNS解析不绕过隧道,第一种方法更可靠):
url = 'http://www.google.com:8888/' response = requests.get(url)
补充说明
SSH隧道在此处仅做端口转发:将本地8888端口的流量转发到远程服务器指向的www.google.com:80。但HTTP协议依赖Host头区分站点,即便流量到达Google服务器,无正确Host头也无法获取对应内容。
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

