0

我想登录$request进来,但想过滤掉密码或密钥等敏感信息。

我尝试了以下方法,但它不起作用:

http {
  log_format xxx '$filtered_request';

  location /xxx {
    set $filtered_request $request;
    if ($filtered_request ~ (.*)password=[^&]*(.*)) {
      set $filtered_request $1password=****$2;
    }

    access_log /var/log/xxx.log xxx;
  }
}

这会将空行保存到日志文件中。

实际上,以下内容也不起作用:

http {
  log_format yyy '$yyy';

  location /foo {
    set $yyy 'abc';
    access_log /var/log/yyy.log yyy;
  }
}

结果仍然是空行。

如何在中使用自定义变量log_format

我正在使用 nginx/1.2.5

更新:我注意到set $yyy 'abc';实际做了一些事情,但该值未反映在日志中。IE:

http {
  log_format yyy '$request $arg_password';
  location /foo {
    set $arg_password 'filtered';
    access_log /var/log/yyy.log yyy;    
  }
}

$arg_password语句随语句变为空,set ...并记录 arg ?password=asdf,就asdf好像set ...语句已被注释掉一样。

4

1 回答 1

0

事实证明,该位置正在进行一些重写:

location /foo {
  ...
  rewrite ^(/foo)... ... break;

  set $filtered_request $request;
  ...
}

如果我set在重写之前移动语句,它工作正常:

location /foo {
  ...

  set $filtered_request $request;
  ...

  rewrite ^(/foo)... ... break;

  ...
}

不知道为什么它具有使变量为空的副作用。但至少手头的问题得到了解决。

于 2018-03-08T01:00:09.977 回答