try_files rewrite drops other get variables

Ian Evans ianevans at
Thu Oct 18 01:55:23 UTC 2012

On 16/10/2012 2:44 PM, Ian M. Evans wrote:
> A couple of wees ago in "Updating some old 'if' statements"
> (,231164,231164#msg-231164) it was
> suggested I use try files instead of the 'if' I had.
> The old location did two things: It ran an extensionless file as a php
> file and also checked for the existence of a statically cached file.
> Though the rewrite is successfully serving the static file and handling
> the extensionless php fine, I didn't initially notice that other GET
> variables like ?page are getting ignored.
> Here's the old 'if' location that passed on all variables just fine:
> old:
> location ~ ^/galleries(/.*$|$) {
>   if (-f /usr/local/nginx/htdocs/pixcache$request_uri/index.html) {
>   expires 2h;
>   rewrite ^(.*)$ /pixcache$1/index.html last;
>   break;
>   }
>   rewrite ^/galleries(/.*$|$) /galleries.php?mypath=$1 last;
>   }
> and the current location with try_files
> location ~ ^/galleries(?P<mypath>/.*$|$) {
>   expires 2h;
>   try_files /pixcache$request_uri/index.html /galleries.php?mypath=$mypath;
>   }
> Those familiar with my posts know I suck at regex, but I'm assuming the
> rewrite in the old location successfully took URLS like:
> /galleries/129/1/3?page=2 and passed them to php as:
> /galleries.php?mypath=/129/1/3&page=2 while something in the new location
> is dropping any additional get variables?
> The old location has been working successfully in production for several
> years but I thought I should get rid of the evil if.
> The try_files version, as I said, works except for the dropping of
> additional get variables in the URL.

I thought adding $args to the end of the try_files line would work but 
that appeared to mess it up more. Is there any way to get the try_files 
version to work like the old version?

Been staring at this but I don't see how
rewrite ^/galleries(/.*$|$) /galleries.php?mypath=$1 last; passes the 
path and additional GET variables, but the try_files version doesn't 
pass on the additional variables.

More information about the nginx mailing list