如何禁用响应 nginx 或 apache 或 caddy 中的 http1 请求?

Posted

技术标签:

【中文标题】如何禁用响应 nginx 或 apache 或 caddy 中的 http1 请求?【英文标题】:how to disable responding to http1 requests in nginx or apache or caddy? 【发布时间】:2017-10-17 06:30:30 【问题描述】:

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

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

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

【问题讨论】:

为什么要阻止 HTTP/1.x 请求? 【参考方案1】:

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

if ($server_protocol ~* "HTTP/1*") 
    return 444;
 

【讨论】:

这只会关闭连接。我什至不想宣传我支持 HTTP1。【参考方案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 的协议,这将立即关闭连接而不发送标头。

【讨论】:

以上是关于如何禁用响应 nginx 或 apache 或 caddy 中的 http1 请求?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 应用程序中 nginx 或 apache 的职责是啥?

如何在 nginx 或 apache httpd 中构建 Angular 4 应用程序?

Node.js“服务器”与 Nginx 或 Apache 服务器相比如何?

将应用程序级别的用户名/用户 ID 注入 nginx/Apache 日志

laravel 在apache或nginx的配置

如何在响应式设计中禁用缩放功能?