如何强制浏览器在无TLS场景下使用HTTP/2协议?
问题解答
主流的桌面/移动端浏览器(Chrome、Firefox、Edge、Safari等)均未支持明文HTTP/2(h2c)协议,没有办法直接在不使用HTTPS的前提下通过普通浏览器模式正常访问HTTP/2服务。
你遇到的ERR_INVALID_HTTP_RESPONSE报错,本质是因为你启动的是未加密的h2c模式HTTP/2服务:浏览器向3000端口发送的是HTTP/1.1标准的请求报文,而服务端返回的是HTTP/2的二进制帧,浏览器无法解析该格式的返回内容,所以抛出无效响应错误。
你可以根据使用场景选择以下解决方式:
方案1:使用带TLS加密的HTTP/2服务(推荐)
这是最符合浏览器标准要求的方案,Node.js中可通过http2.createSecureServer方法创建带TLS的HTTP/2服务,本地调试可使用自签证书:
- 本地生成自签证书可使用mkcert工具,执行
mkcert localhost即可生成适配本地域名的可信证书 - 服务端参考代码如下:
const http2 = require('http2'); const fs = require('fs'); const server = http2.createSecureServer({ // 替换为你的证书文件路径 key: fs.readFileSync('./localhost-key.pem'), cert: fs.readFileSync('./localhost.pem') }); // 处理请求逻辑 server.on('stream', (stream, headers) => { stream.respond({ 'content-type': 'text/html; charset=utf-8', ':status': 200 }); stream.end('<h1>HTTP/2 服务访问正常</h1>'); }); server.listen(3000, () => { console.log(`HTTP/2 server is listening on port 3000. PID: ${process.pid}`); });
配置完成后通过https://localhost:3000访问即可正常加载内容。
方案2:使用支持h2c的工具调试
如果仅做接口逻辑调试不需要浏览器展示,可使用支持明文HTTP/2的工具访问:
- curl工具:执行命令
curl --http2-prior-knowledge http://localhost:3000即可获取响应 - Postman、Apifox等API调试工具:在请求设置中开启HTTP/2支持,即可直接访问h2c模式的服务
内容的提问来源于stack exchange,提问作者Alex Gusev
相关产品推荐
相关产品推荐

