我有一个 http2 服务器,但默认情况下它响应 http1 请求。
我想停止我的服务器响应 http1 请求?
大多数浏览器可能使用 alpn 或 npn。是否有可能只宣传 http2 ?或应用程序协议的自定义列表?
在 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 的协议,这将立即关闭连接而不发送标头。
您可以使用类似下面的规则来阻止所有 http1 请求。但不建议这样做。
if ($server_protocol ~* "HTTP/1*") {
return 444;
}