echo_read_request_body 不起作用。如何记录 POST 请求正文(nginx)?

echo_read_request_body 不起作用。如何记录 POST 请求正文(nginx)?

我需要记录 POST 数据。我已将其添加到我的配置中

 location / {
     echo_read_request_body;
     access_log     /var/log/nginx/domains/site.post.log postdata;
 }

并将其添加到http部分

log_format  postdata '$time_local $request_body';

但在我的日志中我只能看到当地时间和破折号:

23/Jul/2016:16:07:49 +0000 - 

有什么问题?

答案1

我遇到了同样的问题:没有记录任何帖子数据。我通过确保端点返回某些内容解决了我的问题。以下方法对我有用:

location /log {
    echo_read_request_body;
    access_log /var/log/nginx/postdata.log postdata;
    default_type text/html;
    echo "POST";
}

关键是:

  1. 使用以下方式设置 Content-Type 标头default_type
  2. 在响应中提供一些内容echo

答案2

location = / {
  log_format postdata $request_body;
  access_log /var/log/nginx/domains/site.post.log postdata;
  fastcgi_pass php_cgi;
}

nginx 不会触及客户端请求主体,除非必须这样做,因此它不满足 $request_body 变量,有几个例外 1)如果它将请求发送到代理 2)或 fastcgi 服务器。所以在上面这个例子中,技巧是让 nginx 相信你会调用一个 cgi 脚本。

答案3

Nginx 默认不自带包含 的模块,echo_read_request_body需要自行使用该模块进行编译。

在我们的用例中,要记录请求主体,我们需要使用命令echo_read_request_body$request_body变量(包含 Echo 模块的请求主体)。但是,默认情况下,此模块不随 NGINX 一起分发,为了能够使用它,我们必须从其源代码构建 NGINX,方法是使用随附的 Echo 模块的源代码构建它。

https://developers.redhat.com/blog/2016/05/23/configuring-nginx-to-log-post-data-on-linux-rhel/

相关内容