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