0

我有一个 http2 服务器,但默认情况下它响应 http1 请求。

我想停止我的服务器响应 http1 请求?

大多数浏览器可能使用 alpn 或 npn。是否有可能只宣传 http2 ?或应用程序协议的自定义列表?

4

2 回答 2

2

在 Caddy 中,如果您愿意修改源代码,您可以在caddyhttp/httpserver/server.go.

更改显示以下内容的行:

var defaultALPN = []string{"h2", "http/1.1"}

......所以它说:

var defaultALPN = []string{"h2"}

这将阻止它通过 ALPN 发布 HTTP/1.1。

然后将此代码添加到ServeHTTP方法的开头:

func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if !r.ProtoAtLeast(2, 0) {
        if hj, ok := w.(http.Hijacker); ok {
            conn, _, err := hj.Hijack()
            if err == nil {
                conn.Close()
            }
        }
        return
    }
    …
}

如果使用任何早于 HTTP/2 的协议,这将立即关闭连接而不发送标头。

于 2017-05-18T04:18:21.267 回答
0

您可以使用类似下面的规则来阻止所有 http1 请求。但不建议这样做。

if ($server_protocol ~* "HTTP/1*") {
    return 444;
} 
于 2017-05-17T17:27:03.003 回答