POST request body manipulation

Valentin V. Bartenev vbart at
Thu Dec 17 11:51:49 UTC 2015

On Thursday 23 April 2015 18:52:00 Sandro Bordacchini wrote:
> Hello everyone,
> i have a problem in configuring Nginx.
> I have a location that serves as a proxy for a well-specified url "/login".
> This location can receive both GET and POST request.
> GET request have no body and should be proxied to a default and 
> well-know host.
> POST request contains the host to be proxied to in their body 
> (extractable by a regexp).
> To avoid use of "if", i was using a map:
> map $request_body $target_tenant_loginbody {
>      ~*account=(.*)%40(?P<body_tenant>.*)&password.* $body_tenant;
>      default;
> }
>         location /login {
>                  echo_read_request_body;
>                  proxy_pass http://$target_tenant_loginbody:9000;
>                  # Debug
>                  proxy_set_header X-Debug-Routing-Value 
> $target_tenant_loginbody;
>                  proxy_set_header          Host            $host;
>                  proxy_set_header          X-Real-IP $remote_addr;
>                  proxy_set_header          X-Forwarded-For 
> $proxy_add_x_forwarded_for;
>         }
> This is not working (works with the GETs but not with the POSTs), seems 
> that the map returns always the default value even if the regexp works 
> (tested on
> After a few tests, i understood that $request_body is empty or 
> non-initialized. I tried also with $echo_request_body, that seems 
> correctly initialized in location context but not in the map.
> I read about a lot of issues and people having problem with empty 
> $request_body.
> Maybe is there another approach you could direct me to?

The $request_body variable is empty when the body doesn't fit into the
"client_body_buffer_size", or if the "client_body_in_file_only" is enabled.

Also I suggest to turn on the "client_body_in_single_buffer" directive.

  wbr, Valentin V. Bartenev

More information about the nginx mailing list