Как отключить ответы на запросы http1 в nginx или apache или caddy?
У меня есть сервер http2, но по умолчанию он отвечает на запросы http1.
Я хочу, чтобы мой сервер не отвечал на запросы http1?
Большинство браузеров могут использовать alpn или npn. есть ли возможность рекламировать только http2? или пользовательский список протоколов приложений?
2 ответа
В Caddy, если вам удобно изменять исходный код, вы можете внести следующие изменения в caddyhttp/httpserver/server.go
,
Измените строку, которая говорит:
var defaultALPN = []string{"h2", "http/1.1"}
... так что это говорит:
var defaultALPN = []string{"h2"}
Это предотвратит рекламу HTTP/1.1 через ALPN.
Затем добавьте этот код в начало 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;
}