使用nginx真正记录POST请求正文(而不是“-”)

fnx2tebb  于 2023-04-29  发布在  Nginx
关注(0)|答案(3)|浏览(304)

我试图记录POST正文,并在http子句中将$request_body添加到log_format中,但access_log命令在我发送POST请求后只打印“-”作为正文,使用:

curl -d name=xxxx myip/my_location

My log_format(在http子句中):

log_format client '$remote_addr - $remote_user $request_time $upstream_response_time '
                  '[$time_local] "$request" $status $body_bytes_sent $request_body "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

我的位置定义(在server子句中):

location = /c.gif {  
  empty_gif;  
  access_log logs/uaa_access.log client;  
}

如何从curl打印实际的POST数据?

t9aqgxwy

t9aqgxwy1#

Nginx不会解析客户端请求体,除非它真的需要,所以它通常不会填充$request_body变量。
例外情况是:

  • 它将请求发送到代理,
  • 或FastCGI服务器。

所以你真的需要将proxy_passfastcgi_pass指令添加到你的块中。
最简单的方法是将其发送到Nginx本身作为代理服务器,例如使用以下配置:

location = /c.gif {  
    access_log logs/uaa_access.log client;
    # add the proper port or IP address if Nginx is not on 127.0.0.1:80
    proxy_pass http://127.0.0.1/post_gif; 
}
location = /post_gif {
    # turn off logging here to avoid double logging
    access_log off;
    empty_gif;  
}

如果您只希望接收一些键对值,那么限制请求体大小可能是个好主意:

client_max_body_size 1k;
client_body_buffer_size 1k;
client_body_in_single_buffer on;

在使用empty_gif;和curl进行测试时,我也收到了“405 Not Allowed”错误(从浏览器中可以),我将其切换到return 200;以正确地使用curl进行测试。

slhcrj9b

slhcrj9b2#

对于仍然面临此问题的任何人,请检查您的client_body_buffer_size值。
如果请求主体大小大于client_body_buffer_size,那么nginx会将其替换为-

dfty9e19

dfty9e193#

哇,我很高兴使这项工作-我只是想一种方法来捕捉和记录SSL的职位,为一个特殊的测试情况。不管怎样,我是这么做的。
当然,日志格式需要$request_body。
在配置的http(非SSL)部分,我转发给自己-强制日志记录。使用任何对你的目的有利的路径。

listen       8081;
    server_name  localhost;

    location / {
        root   html;
        index  index.html index.htm;
        proxy_pass http://127.0.0.1:8081/kluge; 

    }
    location /kluge {
        root   html;
        index  index.html index.htm;
        access_log off; 

    }

在SSL部分(这是我主要进行测试的地方),相同,但转发到http服务器:

location / {
        root   html;
        index  index.html index.htm;
        # following required to get things to log... 
        proxy_pass http://127.0.0.1:8081/kluge; 
    }

工作得很好,对配置的侵入性很小。当然,我可以通过不使用“/”路径,而是使用一些特定于我测试要求的路径来减少侵入性。
感谢以前的帖子!通过这个我学到了很多关于nginx的知识。

相关问题