Nginx如何在try_files中处理= 404后备

时间:2019-08-19 17:13:27

标签: nginx nginx-location

我有一个示例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:

我发现别名指令应以/结尾,但由于状态仍为200ok,因此仍无法获得= 404功能和目的

2 个答案:

答案 0 :(得分:2)

try_files指令仅支持以下语法:

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

它不支持:

try_files file ... uri =code;

此处fileuri之间的区别在于,对于file自变量,NGINX将在继续下一个自变量之前检查其存在性;对于uri,不会。

如果最后一个参数的形式为=code,则所有在先参数均为file(检查是否存在)。

由此,您可以得出结论,请求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的值)

当以上都不存在时,NGINX将触发404错误。

答案 1 :(得分:1)

您应该定义服务器的根目录,然后定义默认索引,然后将=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则排除了{{1} }。因此,例如,当您尝试获取location

http://example.com/subfolder/filename.txt

将在{p>时返回server_name example.com; root /var/www/html/example; location /subfolder { try_files $uri $uri/ =404; } 的内容(如果存在)

/var/www/html/example/subfolder/filename.txt

将返回server_name example.com; location /subfolder { alias /var/log; try_files $uri $uri/ =404; } 的内容(如果存在)