try_files

Syntax: try_files file ... uri;
try_files file ... =code;
Default:
Context: server, location

Checks the existence of files in the specified order and uses the first found file for request processing; the processing is performed in the current context. The path to a file is constructed from the file parameter according to the root and alias directives. It is possible to check directory’s existence by specifying a slash at the end of a name, e.g. “$uri/”. If none of the files were found, an internal redirect to the uri specified in the last parameter is made. For example:

1
2
3
4
5
6
7
location /images/ {
    try_files $uri /images/default.gif;
}
 
location = /images/default.gif {
    expires 30s;
}

The last parameter can also point to a named location, as shown in examples below. Starting from version 0.7.51, the last parameter can also be a code:

1
2
3
location / {
    try_files $uri $uri/index.html $uri.html =404;
}

Example in proxying Mongrel:

1
2
3
4
5
6
7
8
9
location / {
    try_files /system/maintenance.html
              $uri $uri/index.html $uri.html
              @mongrel;
}
 
location @mongrel {
    proxy_pass http://mongrel;
}

Example for Drupal/FastCGI:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
location / {
    try_files $uri $uri/ @drupal;
}
 
location ~ \.php$ {
    try_files $uri @drupal;
 
    fastcgi_pass ...;
 
    fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME     $fastcgi_script_name;
    fastcgi_param QUERY_STRING    $args;
 
    ... other fastcgi_param's
}
 
location @drupal {
    fastcgi_pass ...;
 
    fastcgi_param SCRIPT_FILENAME /path/to/index.php;
    fastcgi_param SCRIPT_NAME     /index.php;
    fastcgi_param QUERY_STRING    q=$uri&$args;
 
    ... other fastcgi_param's
}

In the following example,

1
2
3
location / {
    try_files $uri $uri/ @drupal;
}

the try_files directive is equivalent to

1
2
3
4
location / {
    error_page 404 = @drupal;
    log_not_found off;
}

And here,

1
2
3
4
5
6
7
8
9
location ~ \.php$ {
    try_files $uri @drupal;
 
    fastcgi_pass ...;
 
    fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
 
    ...
}

try_files checks the existence of the PHP file before passing the request to the FastCGI server.

Example for Wordpress and Joomla:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
location / {
    try_files $uri $uri/ @wordpress;
}
 
location ~ \.php$ {
    try_files $uri @wordpress;
 
    fastcgi_pass ...;
 
    fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
    ... other fastcgi_param's
}
 
location @wordpress {
    fastcgi_pass ...;
 
    fastcgi_param SCRIPT_FILENAME /path/to/index.php;
    ... other fastcgi_param's
}
doc_nginx
2025-01-10 15:47:30
Comments
Leave a Comment

Please login to continue.