nginx:匹配多个位置/禁用访问日志而不返回

dxpyg8gm  于 2023-01-20  发布在  Nginx
关注(0)|答案(2)|浏览(171)

我想禁用某些特定路径的访问日志记录**,但仍将其代理到另一个容器**。换句话说,“匹配多个位置而不返回/退出”,据我所知这是不可能的。
下面的配置将使nginx取消请求而不输入代理传递位置。

server {
    # ...

    # do not log requests for /_nuxt/* and /_ipx/*
    location ~ ^/(_ipx|_nuxt) {
        access_log off;
    }

    # still proxy these paths
    location ~* ^(\/|\/(foo|bar|_nuxt|_ipx)$ {
        proxy_pass         http://frontend:3000;
        proxy_http_version 1.1;
        proxy_set_header   X-Forwarded-For $remote_addr;
        proxy_set_header   Host $server_name:$server_port;
    }
}

除了复制代理配置并将访问日志配置行添加到第二个位置之外,是否有更简洁的方法来实现所需的行为?

server {
    # ...

    # proxy pass without _nuxt and _ipx
    location ~* ^(\/|\/(foo|bar)$ {
        proxy_pass         http://frontend:3000;
        proxy_http_version 1.1;
        proxy_set_header   X-Forwarded-For $remote_addr;
        proxy_set_header   Host $server_name:$server_port;
    }

    # access log + proxy pass
    location ~ ^/(_ipx|_nuxt) {
        access_log off;

        proxy_pass         http://frontend:3000;
        proxy_http_version 1.1;
        proxy_set_header   X-Forwarded-For $remote_addr;
        proxy_set_header   Host $server_name:$server_port;
    }
}
flmtquvp

flmtquvp1#

你是对的,location就像开关盒一样,第一次被击中就断了。也许你可以试试这样的方法:

if ($request_uri ~ ^/(_ipx|_nuxt)) {
    access_log off;
  }

而不是第一个location语句。

sg3maiej

sg3maiej2#

access_log指令的语法如下:
access_log路径[格式[缓冲区=大小] [gzip[=级别]] [刷新=时间][如果=条件]];...
...
if参数(1.7.0)启用条件日志记录。如果条件的计算结果为“0”或空字符串,则不会记录请求。在以下示例中,不会记录响应代码为2xx和3xx的请求:

map $status $loggable {
    ~^[23]  0;
    default 1; 
}

access_log /path/to/access.log combined if=$loggable;

应用于所问问题,这意味着以下配置应可实现预期目标:

map $uri $loggable {
    ~^/_(ips|nuxt)    0;
    default           1;
}
server {
    ...
    access_log /path/to/access.log <format> if=$loggable;
}

相关问题