Take the 2-minute tour ×
Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

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.

share|improve this question

3 Answers 3

  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;
share|improve this answer
    
Thank you! I didn't see that I tried to do it the wrong way. –  Sascha Sep 15 '11 at 21:07

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;
}
share|improve this answer
    
"IfIsEvil": wiki.nginx.org/IfIsEvil –  Alexander Azarov Sep 16 '11 at 5:40
    
@Alexander Good point; that rewrite needs a last to be if-safe. Edited. –  Shane Madden Sep 17 '11 at 16:35

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;
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.