rewrite with $request_uri auto appends args

Maxim Dounin mdounin at mdounin.ru
Fri Nov 5 20:25:36 MSK 2010


Hello!

On Fri, Nov 05, 2010 at 01:08:47PM -0400, NCRonB wrote:

> I've been using the following code to redirect non-www to www-refixed
> domains:
> 
> [code]
> server {
>     server_name example.com;
>     rewrite ^ http://www.example.com$request_uri permanent;
> }
> [/code]
> 
> However, I just realized that when there is a query string, the
> resulting URI has the query string twice.  For example:
> 
> [code]http://example.com/test.html?a=1&b=2[/code]
> 
> ...is rewritten as:
> 
> [code]http://www.example.com/test.html?a=1&b=2?a=1&b=2[/code]
> 
> Is this the correct behavior?

Yes.  Variable $request_uri contains args, while rewrite without 
trailing '?' will add args.

> I can add a '?' to the end of $request_uri to make it work as expected,
> but I've never seen that in any examples, and I didn't think rewrite was

Classic "redirect everything" example contains '?'.  See e.g. 
here:

http://nginx.org/en/docs/http/converting_rewrite_rules.html

: server {
:     listen       80;
:     server_name  nginx.org;
:     rewrite   ^  http://www.nginx.org$request_uri?;
: }

> supposed to auto-append the arguments unless I explicitly put arguments
> on the replacement side.

rewrite is expected to preserve original args in all cases (either 
preserve as is, or append if you added other arguments) unless you 
specified trailing '?'.

Maxim Dounin



More information about the nginx mailing list