try_files 中 nginx 如何处理 =404 回退
How nginx process =404 fallback in try_files
我有一个示例 Web 服务器,在 www 目录中只有一个 index.html 文件。我可以使用以下配置设置 nginx:
location /subfolder {
alias /data/www;
try_files $uri $uri/ /index.html;
}
在浏览器中,我可以在我的本地域上看到正确的响应 test.local/subfolder
,还有一个默认的 nginx 页面 test.local/subfolder/something
return(这是正常的,因为没有设置 root)
如果我将配置更改为
location /subfolder {
alias /data/www;
try_files $uri $uri/ /index.html =404;
}
对 test.local/subfolder
的响应仍然正确,但是 test.local/subfolder/something
和所有带有 /subfolder 前缀的 URI return 正确响应的 index.html 状态也是 200 而不是 404。如果我从 try_files 中删除 /index
,我会得到相同的结果
我想知道 nginx 如何使用 =404 回退处理请求,但找不到任何信息,甚至在官方文档中也找不到。
UDAPTE:
我发现别名指令应该以 /
结尾,但仍然没有得到 =404 功能和用途,因为状态仍然是 200ok
您应该定义服务器的根目录,然后是默认索引,然后将 =404
添加到 try_files
:
server {
server_name example.com;
root /var/www/html/example.com;
index index.html index.htm index.php;
# This is optional - if you want a customized 404 error page
error_page 404 /404.html;
location /subfolder {
try_files $uri $uri/ =404;
}
}
root
和alias
的区别在于root
附加location
获取文件系统中的绝对路径,而alias
排除location
。因此,例如,当您尝试获取 http://example.com/subfolder/filename.txt
server_name example.com;
root /var/www/html/example;
location /subfolder {
try_files $uri $uri/ =404;
}
将return/var/www/html/example/subfolder/filename.txt
的内容(如果存在),而
server_name example.com;
location /subfolder {
alias /var/log;
try_files $uri $uri/ =404;
}
将return/var/log/filename.txt
的内容(如果存在)
try_files
指令仅支持这些语法:
try_files file ... uri;
try_files file ... =code;
不支持:
try_files file ... uri =code;
此处 file
和 uri
的区别在于,对于 file
参数,NGINX 将在继续之前检查它们的 存在性 下一个参数;对于 uri
,它不会。
如果最后一个参数的形式是 =code
,那么它之前的所有参数都是 file
s(检查是否存在)。
由此,您可以得出一个结论,请求 URI /foo/bar
和此配置:
root /var/www;
location /foo/ {
try_files $uri $uri/ =404;
}
... 如果 file
中的任何一个存在,将不会触发 404 错误:
/var/www/foo/bar
/var/www/foo/bar/
目录(如果您启用了 autoindex
)
/var/www/foo/bar/index.html
(或index.php
等)(由于index
的值)
只有当上述none存在时,NGINX会触发404错误。
我有一个示例 Web 服务器,在 www 目录中只有一个 index.html 文件。我可以使用以下配置设置 nginx:
location /subfolder {
alias /data/www;
try_files $uri $uri/ /index.html;
}
在浏览器中,我可以在我的本地域上看到正确的响应 test.local/subfolder
,还有一个默认的 nginx 页面 test.local/subfolder/something
return(这是正常的,因为没有设置 root)
如果我将配置更改为
location /subfolder {
alias /data/www;
try_files $uri $uri/ /index.html =404;
}
对 test.local/subfolder
的响应仍然正确,但是 test.local/subfolder/something
和所有带有 /subfolder 前缀的 URI return 正确响应的 index.html 状态也是 200 而不是 404。如果我从 try_files 中删除 /index
,我会得到相同的结果
我想知道 nginx 如何使用 =404 回退处理请求,但找不到任何信息,甚至在官方文档中也找不到。
UDAPTE:
我发现别名指令应该以 /
结尾,但仍然没有得到 =404 功能和用途,因为状态仍然是 200ok
您应该定义服务器的根目录,然后是默认索引,然后将 =404
添加到 try_files
:
server {
server_name example.com;
root /var/www/html/example.com;
index index.html index.htm index.php;
# This is optional - if you want a customized 404 error page
error_page 404 /404.html;
location /subfolder {
try_files $uri $uri/ =404;
}
}
root
和alias
的区别在于root
附加location
获取文件系统中的绝对路径,而alias
排除location
。因此,例如,当您尝试获取 http://example.com/subfolder/filename.txt
server_name example.com;
root /var/www/html/example;
location /subfolder {
try_files $uri $uri/ =404;
}
将return/var/www/html/example/subfolder/filename.txt
的内容(如果存在),而
server_name example.com;
location /subfolder {
alias /var/log;
try_files $uri $uri/ =404;
}
将return/var/log/filename.txt
的内容(如果存在)
try_files
指令仅支持这些语法:
try_files file ... uri;
try_files file ... =code;
不支持:
try_files file ... uri =code;
此处 file
和 uri
的区别在于,对于 file
参数,NGINX 将在继续之前检查它们的 存在性 下一个参数;对于 uri
,它不会。
如果最后一个参数的形式是 =code
,那么它之前的所有参数都是 file
s(检查是否存在)。
由此,您可以得出一个结论,请求 URI /foo/bar
和此配置:
root /var/www;
location /foo/ {
try_files $uri $uri/ =404;
}
... 如果 file
中的任何一个存在,将不会触发 404 错误:
/var/www/foo/bar
/var/www/foo/bar/
目录(如果您启用了autoindex
)/var/www/foo/bar/index.html
(或index.php
等)(由于index
的值)
只有当上述none存在时,NGINX会触发404错误。