Clean-URL rewrite rule with nested "location" and alias directive

Francis Daly francis at
Tue Nov 19 20:39:16 UTC 2013

On Tue, Nov 19, 2013 at 01:45:15PM -0500, Ben Johnson wrote:
> On 11/19/2013 12:38 PM, Francis Daly wrote:
> > On Tue, Nov 19, 2013 at 10:36:53AM -0500, Ben Johnson wrote:

Hi there,

> >> This works as expected, with one major exception: "clean-URL" rewriting
> >> does not work. In other words, the homepage (/stage/) loads correctly,
> >> but all sub-pages return a 404.

Which nginx version do you use, where you get that output with the config
snippet that you provided?

I've tried 1.4.3 and 1.5.7, and I don't get /stage/ to load correctly.

I suspect I'm just doing something silly.

> Certainly: an example URL is /stage/my-account/ . Ultimately, I would
> like for this URL to be rewritten to
> /stage/index.php?q=/stage/my-account/ (the file "index.php" exists on
> the filesystem at /var/www/

I think that the problem may be due to the interaction between "alias"
and "$document_root" being not-always-obvious.

And $document_root is used in try_files, which is probably what you
want for "clean URLs" -- serve the file if present, else hand it to
a controller.

Does the following do what you want for all cases you care about?

      location ^~ /stage/ {
        alias /var/www/;
        index index.php index.html index.htm;
        try_files $uri $uri/ /stage//stage/index.php?q=$uri;

        location ~ ^/stage/(.+\.php)$ {
                alias /var/www/$1;
                try_files "" / /stage/index.php?q=$uri;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_param HTTPS on;
                fastcgi_param SCRIPT_FILENAME $request_filename;
                include /etc/nginx/fastcgi_params;

You may want to use something other than $uri in the last argument to
try_files, depending on how you want /stage/my-account/?key=value to
be processed.

And the curious-looking try_files lines are deliberate.

Francis Daly        francis at

More information about the nginx mailing list