ログを記録しようとしていますPOST body、and $request_body
からlog_format
はhttp
句で使用しますが、access_log
コマンドは、POSTを使用してリクエストを送信した後、「-」を本文として出力します:
curl -d name=xxxx myip/my_location
私の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データをどのように印刷できますか?
Nginxは、本当に必要な場合を除いて、クライアント要求の本文を解析しません。そのため、通常、$request_body
変数は埋められません。
例外は次の場合です。
そのため、ブロックに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;
empty_gif;
とcurlを使用してテストするときに「405 Not Allowed」エラーも受信しました(ブラウザからは問題ありませんでした)、curlで適切にテストするためにreturn 200;
に切り替えました。