try_files rewrite drops other get variables

Ian M. Evans ianevans at
Tue Oct 16 18:44:08 UTC 2012

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:

location ~ ^/galleries(/.*$|$) {
 if (-f /usr/local/nginx/htdocs/pixcache$request_uri/index.html) {
 expires 2h;
 rewrite ^(.*)$ /pixcache$1/index.html last;
 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.

More information about the nginx mailing list