try_files behaviour details

Maxim Dounin mdounin at
Tue Aug 17 03:02:07 MSD 2010


On Mon, Aug 16, 2010 at 04:07:41PM -0400, Ensiferous wrote:

> Hey,
> I have a question about how try_files works in some cases. The standard
> case seems to be 
> server {
> 	server_name foo;
> 	location / {
> 		try_files $uri index.html;
> 	}
> }
> Here nginx tries $uri and then finally index.html if no other location
> block matches. Now say that there are no other location blocks and nginx
> enters location / again, the try_files directive is then skipped as it's
> already been used once, right?

No.  In the example above nginx will enter location /, test $uri 
existance, if not found - it will issue internal redirect to 
fallback agument, "index.html" in this case.

As "index.html" (invalid uri, may only happen due to internal 
redirects like the above) isn't matched by location / it will be 
processed in default location context.  With default root 
("/usr/local/nginx/html") it will try to access 
"/usr/local/nginx/htmlindex.html" file.

> Second example:
> server {
> 	server_name bar;
> 	try_files $uri index.php;
> }
> Here try_files is used in the server block. The wiki says try_files
> can't be used here but Nginx will happily accept it, from my testing it
> seems to behave identically to the first example except it's always
> executed. Is this a correct assumption?

In this example you define try_files in default location context, 
the one which match both valid uris and "index.php".

Maxim Dounin

More information about the nginx mailing list