POST request body manipulation

Valentin V. Bartenev vbart at nginx.com
Thu Dec 17 11:57:58 UTC 2015


On Thursday 17 December 2015 14:51:49 Valentin V. Bartenev wrote:
> 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          default.example.com;
> > }
> > 
> >         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 regex101.com).
> > 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. 
> 
> http://nginx.org/r/client_body_buffer_size
> http://nginx.org/r/client_body_in_file_only
> http://nginx.org/r/client_body_in_single_buffer
> 
[..]

But in your case it's empty because the $target_tenant_loginbody variable
is evaluated before the body has been read.

So you can't use it in the proxy_pass directive.

  wbr, Valentin V. Bartenev



More information about the nginx mailing list