我在让nginx有条件地记录请求正文时遇到了一些麻烦。我不想记录登录凭据,因此包含了当URI不是登录URI时正确触发的映射。似乎有一些类似的帖子建议使用
client_body_in_single_buffer on
fastcgi_pass php_cgi
echo_read_request_body
但这些似乎都没有帮助。有任何想法吗?以下是当前配置。
map $request_uri $log_body {
~/login 0;
default 1;
}
log_format filter '$remote_addr - $remote_user [$time_local] '
'"$request" $status $request_time $upstream_response_time "$scrubbed_request"';
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/ssl/site.crt;
ssl_certificate_key /etc/ssl/site.key;
access_log /var/log/nginx/site.log filter;
location /branch/dev/v2/ {
set $scrubbed_request 'NOT LOGGED';
if ($log_body) {
set $scrubbed_request $request_body;
}
rewrite /branch/dev/(.*) /$1 break;
proxy_pass http://127.0.0.1:3001;
}
location /branch/dev/ {
rewrite /branch/dev/(.*) /$1 break;
proxy_pass http://127.0.0.1:4001;
}
}
请注意,如果$scrubbed_request
在log_format行中替换为$request_body
,我们会捕获所有请求正文。这让我觉得set
语句以某种方式以某种意外的方式消耗了request_body
。
答案 0 :(得分:0)
read the documentation始终是个好主意:
当请求正文被读取到memory buffer时,变量的值在proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass指令处理的位置可用。
正如您所看到的,您必须将client_body_buffer_size
配置得足以将整个身体存储在内存中。
您也不需要set
语句,可以使用the if
parameter of access_log
和不同的格式。