You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测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需满足:

  1. 配置TLS证书,使用http.ListenAndServeTLS启动服务器(HTTP2默认通过TLS传输,协议标识为h2);
  2. 若需明文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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:25:05