【问题标题】:NGINX get http version of request in locationNGINX在位置获取http版本的请求
【发布时间】:2021-02-13 17:48:30
【问题描述】:

在 nginx 配置中,如果请求的 http 版本不存在或小于 1,我想返回 401。 类似于以下内容:-

location / {
   if ($requestHttpVersion = '' OR $requestHttpVersion != 1.1){
    return 401;
    }
}

我怎样才能做到这一点?

【问题讨论】:

    标签: nginx nginx-reverse-proxy nginx-config nginx-location nginx-ingress


    【解决方案1】:

    您应该检查一个 $request 内置 nginx 变量,其中包含完整的原始请求行,通常类似于 GET <URI> HTTP/<version>:

    if ($request !~ \sHTTP/1\.1$) {
        return 401;
    }
    

    【讨论】:

    • 我不是在谈论“标题”版本。我说的是作为请求的一部分发送的标头。想知道是否在任何 nginx 变量中设置了这一点
    • @CarlssonEvert 所有的HTTP请求头都可以通过$http_<header_name>变量访问,你的例子使用了$http_version变量,这就是我提到的原因。
    • 感谢您指出这一点 - 我将编辑变量名称以防止混淆
    • 似乎有更好的办法——map $server_protocol $prot { default "null"; HTTP/1.1 是; HTTP/1.0 是; HTTP/2.0 是; } 添加位置块: if ( $prot = "null" ) { return 504; }
    【解决方案2】:

    这行得通,我相信这是一个更好的解决方案

    http{
        map $server_protocol $httpVersion {
                default "invalid";
                HTTP/1.1 "valid";
                HTTP/1.0 "valid";
                HTTP/2.0 "valid";
        }
    
        location / {
            if ( $httpVersion = "invalid" )
            {
                return 401;
            }
            proxy_pass ....
            ...
        }
    }
    

    【讨论】:

    • 确实这看起来是一个更好的解决方案,以前不知道$server_protocol 变量。一些更优化的解决方案是map $server_protocol $disallow_access { HTTP/1.0 ""; HTTP/1.1 ""; HTTP/2.0 ""; default 1; }if ($disallow_access) { return 401; }
    猜你喜欢
    • 2016-10-16
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多