1
我在獲取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
。
如果我的請求主體只是一個像'abcdef'這樣的小字符串,如何提高'client_body_in_single_buffer'的幫助?看起來這個字符串應該很容易適應16K緩衝區,文檔說這是爲64位實例提供的。我錯過了什麼嗎? – Justin
@Justin你還沒有提到你的請求體有多大。所以,大小是可以的,那麼你應該避免使用'set'。 'set'指令是重寫模塊的一部分,它在nginx開始讀取主體之前工作。 – VBart