Назад | Перейти на главную страницу

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 - 

В чем проблема?

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-скрипт.

По умолчанию 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/

У меня была та же проблема: данные не регистрировались. Я исправил свою проблему, убедившись, что конечная точка что-то вернула. У меня сработало следующее:

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