首页 > 解决方案 > nginx process = 404 如何在try_files中回退

问题描述

我有一个示例 Web 服务器,在 www 目录中只有一个 index.html 文件。我可以使用以下配置设置 nginx:

location /subfolder {
     alias /data/www;
     try_files $uri $uri/ /index.html;
}

在浏览器中,我可以在我的本地域上看到正确的响应test.local/subfolder,还test.local/subfolder/something返回一个默认的 nginx 页面(这是正常的,因为没有设置 root)

如果我将配置更改为

location /subfolder {
     alias /data/www;
     try_files $uri $uri/ /index.html =404;
}

对的响应test.local/subfolder仍然正确,但是test.local/subfolder/something所有带有 /subfolder 前缀的 URI 都返回正确响应的 index.html,状态也是 200 而不是 404。如果我/index从 try_files 中删除,我会得到相同的结果

我想知道 nginx 如何处理 =404 后备的请求,但找不到任何信息,甚至在官方文档中也找不到。

UDAPTE:

我发现别名指令应该以一个结尾,/但仍然没有得到 =404 的功能和目的,因为状态仍然是 200ok

标签: nginxnginx-location

解决方案


try_files指令仅支持以下语法:

try_files file ... uri;
try_files file ... =code;

它不支持:

try_files file ... uri =code;

file和这里的区别在于uri,对于file参数,NGINX 会在继续下一个参数之前检查它们的存在;因为uri,它不会。

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

由此,您可以得出一个结论,即使用请求 URI/foo/bar和此配置:

root /var/www;
location /foo/ {
  try_files $uri $uri/ =404;
}

file...如果存在任何 s ,则不会触发 404 错误:

  • /var/www/foo/bar
  • /var/www/foo/bar/目录(如果您已autoindex启用)
  • /var/www/foo/bar/index.html(或index.php等)(由于 的值index

只有当以上都不存在时,NGINX 才会触发 404 错误。


推荐阅读