如何通过HTTP Header强制HTTPS连接使用HTTP/1.1版本?
能否通过Header强制HTTPS连接使用HTTP/1.1?
核心结论
不能通过HTTP Header强制使用HTTP/1.1。HTTP版本的协商发生在TLS握手阶段(通过ALPN扩展),远早于HTTP Header的发送。当客户端发起HTTPS连接时,会先和服务器协商要使用的应用层协议(HTTP/2、HTTP/1.1等),协商完成后才会发送HTTP请求头。
curl --http1.1参数的原理
curl的--http1.1参数并非通过修改Header实现,而是在TLS握手时跳过HTTP/2的ALPN协商,直接告知服务器只支持HTTP/1.1,从而强制使用该版本协议。这也是为什么加上这个参数能成功访问目标服务器的原因——避免了和中间服务器协商HTTP/2,后续转发到终端服务器时协议匹配。
替代curl的解决方案
以下是几种不依赖curl的实现方式:
1. wget
使用--no-http2参数禁用HTTP/2支持:
wget --no-http2 https://target-server.com
2. Python Requests库
自定义适配器强制使用HTTP/1.1:
import requests from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager class HTTP11Adapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): # 指定仅使用HTTP/1.1 kwargs["http_version"] = "HTTP/1.1" self.poolmanager = PoolManager(*args, **kwargs) # 创建会话并挂载适配器 session = requests.Session() session.mount("https://", HTTP11Adapter()) # 发起请求 response = session.get("https://target-server.com") print(f"响应状态码: {response.status_code}")
3. Node.js
通过https模块指定ALPN协议仅为HTTP/1.1:
const https = require('https'); const options = { hostname: 'target-server.com', port: 443, path: '/', method: 'GET', // 只协商HTTP/1.1 ALPNProtocols: ['http/1.1'] }; const req = https.request(options, (res) => { console.log(`状态码: ${res.statusCode}`); res.on('data', (data) => { process.stdout.write(data); }); }); req.on('error', (err) => { console.error('请求错误:', err); }); req.end();
4. OpenSSL手动连接
直接通过OpenSSL建立指定ALPN的TLS连接,再手动发送HTTP/1.1请求:
# 建立TLS连接,指定ALPN为http/1.1 openssl s_client -connect target-server.com:443 -alpn http/1.1 # 连接成功后,手动输入以下内容(回车两次结束): GET / HTTP/1.1 Host: target-server.com Connection: close
5. Postman
在Postman的设置中关闭HTTP/2支持:
- 进入「Settings」>「General」
- 找到「HTTP/2」选项,取消勾选「Enable HTTP/2」
内容的提问来源于stack exchange,提问作者myol
相关产品推荐
相关产品推荐

