Try_files behaviour details

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?

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?

Posted at Nginx Forum:

Hello!

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

}
}

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.

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 D.

mike Wrote:

i have try_files outside of location blocks
plenty.

the wiki probably just needs updating

This was my purpose for asking, I know try_files works just fine outside
of location blocks, but I wanted to make sure I fully understood how
try_files would work before changing the wiki.

Posted at Nginx Forum:

i have try_files outside of location blocks plenty.

the wiki probably just needs updating