Подтвердить что ты не робот

Действительно регистрировать тело запроса POST (вместо "-" ) с помощью nginx

Я пытаюсь записать тело POST и добавить $request_body в предложение log_format в http, но команда 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"';

Мое определение местоположения (в предложении сервера):

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

Как я могу распечатать фактические данные POST из curl?

4b9b3361

Ответ 1

Nginx не анализирует тело запроса клиента, если это действительно необходимо, поэтому он обычно не заполняет переменную $request_body.

Исключения составляют:

  • отправляет запрос прокси,
  • или сервер fastcgi.

Поэтому вам действительно нужно либо добавить директивы proxy_pass, либо fastcgi_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;

Я также получил ошибки "405 недопустимых" при тестировании с помощью empty_gif; и завитки (в браузере это было нормально), я переключил его на return 200;, чтобы правильно протестировать с помощью curl.