Nginx rewrite append a parameter at the end of an url

nginxregex

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.

Best Answer

  1. In rewrite you match against URL's path part only. Which means, $1 will not contain the query string.
  2. 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;