如何检测HTTP请求是否为HTTP2?判断HTTP服务器连接协议版本
检测HTTP请求是否采用HTTP2协议及Go语言服务器端版本判断
一、通用检测HTTP2请求的方法
- 浏览器开发者工具:打开浏览器「开发者工具」→「网络」面板,查看请求列表的「协议」列,HTTP2请求会显示为
h2,HTTP1.1则显示为HTTP/1.1。 - 命令行工具(如curl):执行
curl -v https://example.com,在TLS握手的输出信息里,若看到ALPN, server accepted h2,说明使用了HTTP2;如果是明文HTTP2(h2c),可通过curl --http2-prior-knowledge http://example.com强制发起HTTP2请求,观察响应是否正常。 - 请求头与传输格式:HTTP2采用二进制帧传输,而非HTTP1.x的文本格式;若通过HTTP1.1升级到HTTP2,请求头会包含
Upgrade: h2c和HTTP2-Settings字段。
二、Go语言HTTP服务器处理函数中判断协议版本
Go的http.Request结构体提供了直接获取协议版本的字段:
r.ProtoMajor:协议主版本号(HTTP2为2,HTTP1.x为1)r.ProtoMinor:协议次版本号(HTTP1.1为1,HTTP1.0为0)r.Proto:完整协议字符串,如HTTP/2.0、HTTP/1.1
代码示例
func(w http.ResponseWriter, r *http.Request){ switch { case r.ProtoMajor == 2: w.Write([]byte("当前连接使用HTTP/2协议")) case r.ProtoMajor == 1 && r.ProtoMinor == 1: w.Write([]byte("当前连接使用HTTP/1.1协议")) case r.ProtoMajor == 1 && r.ProtoMinor == 0: w.Write([]byte("当前连接使用HTTP/1.0协议")) default: w.Write([]byte("未知协议版本")) } }
注意事项
Go标准库HTTP服务器默认支持HTTP1.1,启用HTTP2需满足:
- 配置TLS证书,使用
http.ListenAndServeTLS启动服务器(HTTP2默认通过TLS传输,协议标识为h2); - 若需明文HTTP2(
h2c),需手动调用http2.ConfigureServer配置,示例如下:
import ( "net/http" "golang.org/x/net/http2" ) func main() { mux := http.NewServeMux() mux.HandleFunc("/", handler) server := &http.Server{Addr: ":8080", Handler: mux} err := http2.ConfigureServer(server, &http2.Server{}) if err != nil { panic(err) } server.ListenAndServe() }
内容的提问来源于stack exchange,提问作者clarkk
相关产品推荐
相关产品推荐

