nginx利用request_body记录POST body(location中用proxy_pass)

1.完整过程

1.1 在nginx.confhttp里面添加配置如下:

http {
	...
	log_format postdata escape=json '$remote_addr - $remote_user [$time_local] "$request" 
		                        '$status $body_bytes_sent "$http_referer" '
		                        '"$http_user_agent" "$http_x_forwarded_for" "$request_body"';
	upstream bk_server {
		server 127.0.0.1:12345;
	}
	server {
		listen 12345;
		location / {
		        proxy_pass http://bk_server/test;
                        access_log /var/log/nginx/post.log postdata;
		}
		location /test {
		        return 202;
		}
	}
	...
}

检查nginx配置语法有无错误

nginx -t

若无语法错误,则reload nginx配置,使最新的nginx配置生效

nginx -s reload

1.2 使用curl命令模拟post请求

curl -i  -d "arg1=1&arg2=2&hi=你好" "http://127.0.0.1:12345"

查看日记:

tail -n 10 /var/log/nginx/post.log

得到结果:

...省略其他参数的值...  "arg1=1&arg2=2&hi=你好"

如果nginx装在公网服务器上,那么请将127.0.0.1换成公网ip

2.说明

2.1 log_format配置

log_format官方文档
log_format 语法:

log_format name [escape=default|json|none] string ...;
  • postdata: 名称
  • escape=json: 在配置日志格式时加上此参数可以不转义变量内容,这里为了显示POST body里面的中文。(escape参数,到版本1.11.8才有,escape参数的none值到1.13.10版本才有)
  • $request_body: 只有location中用到proxy_pass,fastcgi_pass,scgi_pass命令时,该变量才有值。request_body官网文档

英文描述如下:
request_body
The variable’s value is made available in locations processed by the proxy_pass, fastcgi_pass, uwsgi_pass, and scgi_pass directives when the request body was read to a memory buffer.

2.1.1

test

2.2 bk_server

bk_server是为了使用proxy_pass而设置的。

3.显示HTTPS里面的POST body(可选)

如网站已使用HTTPS,那么配置如下:

3.1 除了需要把access_log那一行注释掉之外,步骤1中的配置不变。

3.2 其他配置如下

server {
        # Redirect all http requests to https.
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name _;
        return 301 https://$host$request_uri;
}
server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name www.your_domain your_domain;
        ...
        # Record POST body
        location /post {
                proxy_pass http://127.0.0.1:12345;
                access_log /var/log/nginx/post.log postdata; #这里设置之后,需要把步骤1里面的access_log那一行注释掉
        }
        ...
}

检查nginx配置语法有无错误

nginx -t

若无语法错误,则reload nginx配置,使最新的nginx配置生效

nginx -s reload

使用curl命令模拟post请求

curl -i  -d "arg1=1&arg2=2&hi=你好" "https://your_domain/post"

查看日记:

tail -n 10 /var/log/nginx/post.log

得到结果:

...省略其他参数的值...  "arg1=1&arg2=2&hi=你好"

参考: nginx记录post body/payload数据

posted @ 2021-04-25 11:06  enjoy_jun  阅读(4968)  评论(0编辑  收藏  举报