Как отключить ответы на запросы 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;
} 
Другие вопросы по тегам