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

nginx: Match multiple locations / disable access log without returning

我想禁用某些特定路径的访问日志记录但仍将其代理到另一个容器。换句话说,“在没有 returning/exiting 的情况下匹配多个位置”,据我所知这是不可能的。

下面的配置会让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;
    }
}

你说得对,location 就像开关盒一样工作,先下手为强。 也许你可以尝试这样的事情:

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

而不是您的第一个位置声明。

更新:以下解决方案不可行。 我把它作为对每个人的警告。虽然相同的方法可以用于其他一些指令(例如 auth_basic),但它不适用于 access_log 指令。


@araisch 提出的解决方案应该可行,只是为了完整起见,还有一个选项可以使用 map 块执行相同的操作:

map $uri $logfile {
    ~^/_(ips|nuxt)    off;
    default           /path/to/access.log;
}
server {
    ...
    access_log $logfile; # or 'access_log $logfile <format>'
    ...
}