try_files for alias

Igor Sysoev is at rambler-co.ru
Thu Jun 18 18:10:37 MSD 2009


On Wed, Jun 17, 2009 at 09:57:41AM +0700, Edho P Arief wrote:

> How do I make this work?
> 
> location ~ /~someapp(.*)$ { alias /home/someapp/root$1; try_files $uri
> /~someapp/err404.htm; }
> 
> The try_files never catch the $uri (nor $1) and returns 500 (redirection cycle)
> 
> Am I 'forced' to use error_page in this case?
> 
> This works:
> 
> location ~ /~someapp(.*)$ { alias /home/someapp/root$1; error_page 404
> /~someapp/err404.htm; }
> 
> and without regex the error_page and try_files seem to be completely ignored:
> neither
>     location /~someapp/ { alias /home/someapp/root/; error_page 404
> /~someapp/err404.htm; }
> nor
>     location /~someapp/ { alias /home/someapp/root/; try_files $uri
> /~someapp/err404.htm; }
> works.

If request is "/~someapp/one", then this location

    location /~someapp/ {
        alias     /home/someapp/root/;
        try_files $uri   /~someapp/err404.htm;
    }

will test /home/someapp/root/one existence.

As to

    location ~ /~someapp(.*)$ {
        alias /home/someapp/root$1;
        try_files $uri /~someapp/err404.htm;
    }

this "alias" with captures is special case.
A "root" is always just prefix to URI and "try_files" tests "root$uri".
An "alias" without captures replaces location part in URI with
the "alias" value, and "try_files" tests "alias/modified_uri"
An "alias" with captures replaces a whole URI with the "alias" value,
and "try_files" tests "alias/$uri", and $uri is surpplus here.
You need just to pass empty value to "try_files":

    location ~ /~someapp(.*)$ {
        alias /home/someapp/root$1;
        try_files ""  /~someapp/err404.htm;
    }


-- 
Igor Sysoev
http://sysoev.ru/en/





More information about the nginx mailing list