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>'
...
}
我想禁用某些特定路径的访问日志记录但仍将其代理到另一个容器。换句话说,“在没有 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>'
...
}