POST request body manipulation
Valentin V. Bartenev
vbart at nginx.com
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 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
wbr, Valentin V. Bartenev
More information about the nginx
mailing list