30

$request_bodyPOST 本文をログに記録してlog_formatinhttp句に追加しようとしていますが、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;  
}

curl から実際の POST データを印刷するにはどうすればよいですか?

4

1 に答える 1

63

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;

とcurlを使用してテストしたときに「405 Not Allowed」エラーも受け取りました(ブラウザからは問題ありませんでした)。curlで適切にテストするようempty_gif;に切り替えました。return 200;

于 2013-07-20T18:15:43.203 に答える