title: Logging POST data from $request_body
body: <p>I have my config setup to handle a bunch of GET requests which render pixels that work fine to handle analytics and parse query strings for logging. With an additional third party data stream, I need to handle a POST request to a given url that has JSON in an expected loggable format inside of it's request body. I don't want to use a secondary server with <code>proxy_pass</code> and just want to log the whole response into an associated log file like what it does with GET requests. A snippet of some code that I'm using looks like the following:</p>
  
  <p>GET request (which works great):</p>
  
  <pre><code>location ^~ /rl.gif {
    set $rl_lcid $arg_lcid;
    if ($http_cookie ~* "lcid=(.*\S)")
    {
      set $rl_lcid $cookie_lcid;
    }
    empty_gif;
    log_format my_tracking '{ "guid" : "$rl_lcid", "data" : "$arg__rlcdnsegs" }';
    access_log  /mnt/logs/nginx/my.access.log my_tracking;
    rewrite ^(.*)$ http://my/url?id=$cookie_lcid? redirect;
  }
  </code></pre>
  
  <p>Here is kinda what I am trying to do:
  POST request (which does not work):</p>
  
  <pre><code>location /bk {
    log_format bk_tracking $request_body;
    access_log  /mnt/logs/nginx/bk.access.log bk_tracking;
  }
  </code></pre>
  
  <p>Curling <code>curl http://myurl/bk -d name=example</code> gives me a 404 page not found.</p>
  
  <p>Then I tried:</p>
  
  <pre><code>location /bk.gif {
    empty_gif;
    log_format bk_tracking $request_body;
    access_log  /mnt/logs/nginx/bk.access.log bk_tracking;
  }
  </code></pre>
  
  <p>Curling <code>curl http://myurl/bk.gif -d name=example</code> gives me a <code>405 Not Allowed</code>.</p>
  
  <p>My current version is <code>nginx/0.7.62</code>. Any help in the right direction is very much appreciated! Thanks!</p>
  
  <p><strong><em>UPDATE</em></strong>
  So now my post looks like this:</p>
  
  <pre><code>location /bk {
    if ($request_method != POST) {
      return 405;
    }
    proxy_pass $scheme://127.0.0.1:$server_port/dummy;
    log_format my_tracking $request_body;
    access_log  /mnt/logs/nginx/my.access.log my_tracking;
  }
  location /dummy { set $test 0; }
  </code></pre>
  
  <p>It is logging the post data correctly, but returns a 404 on the requesters end. If I change the above code to return a 200 like so:</p>
  
  <pre><code>location /bk {
    if ($request_method != POST) {
      return 405;
    }
    proxy_pass $scheme://127.0.0.1:$server_port/dummy;
    log_format my_tracking $request_body;
    access_log  /mnt/logs/nginx/my.access.log my_tracking;
    return 200;
  }
  location /dummy { set $test 0; }
  </code></pre>
  
  <p>Then it return the <code>200</code> correctly, but no longer records the post data.</p>
  
  <p><strong>ANOTHER UPDATE</strong>
  Kinda found a working solution. Hopefully this can help other on their way.</p>