nginx rewrite append a parameter at the end of an url
I need to configure my reverse proxy so that the following parameter will be added at the end of the url: &locale=de-de
This almost works:
rewrite ^(.*)$ $1&locale=de-de break;
However, the problem is that I need to append '&locale=de-de' only if it isn't already there and if there is a '?' in the url...
Can I get some help on formulating the correct regex to do this?
Another question:
Why is the question mark in my url not shown if I use this:
$uri?$args
Or $uri$is_args$args translates the url not encoded and the question mark is show as %3f.
Ideas?
EDIT: It seems that this behaviour exists while using in combination with proxy_pass. In a simple rewrite it works really well.
- In
rewrite
you match against URL's path part only. Which means,$1
will not contain the query string. - By default, Nginx appends original query string to the rewrite replacement.
So, it should be safe to write
rewrite ^(.*)$ $1?locale=de-de break;
In the case you do not want Nginx to append the original query string, simply specify ?
in the end of replacement URL:
rewrite ^(.*)$ $1?locale=de-de? break;
The match for rewrite
doesn't include the query params, so you need to test for that elsewhere.
Try:
if ($args !~* locale=de\-de){
rewrite ^(.*)$ $1&locale=de-de last;
}
The rewrite
does not modify the request parameters, only the path portion of the URI. In my experience, messing with the rewrites leads to weird cycles, where the new parameter gets appended ad infinitum. Rewrite is probably not the way to do this in Nginx.
Instead, you should modify the $args
variable using the set
directive:
set $args $args&locale=de-de;