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;
  }
}

rootalias的区别在于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;

此处 fileuri 的区别在于,对于 file 参数,NGINX 将在继续之前检查它们的 存在性 下一个参数;对于 uri,它不会。

如果最后一个参数的形式是 =code,那么它之前的所有参数都是 files(检查是否存在)。

由此,您可以得出一个结论,请求 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错误。