try_files 似乎在错误的目录中查找

try_files 似乎在错误的目录中查找

我正在尝试设置 try_files,但遇到了一个问题:似乎没有拾取备用文件“empty.png”,即使它位于/path/to/old_cache_data/empty.png。实际存在的文件(即没有备用文件)可以毫无问题地找到。同样有趣的是,我没有收到 nginx 404,而是收到来自应用程序的 404 页面,该页面由下面的 proxy_pass 处理。

我到目前为止尝试过的东西:

  • 删除前导斜杠,这会导致这个奇怪的错误:open() "/usr//htmlempty.png" failed (2: No such file or directory),对我来说这似乎很奇怪,因为 /usr/html 没有在任何地方指定为任何类型的后备路径。
  • 指定绝对路径(即try_files $uri /path/to/old_cache_data/empty.png;

相关规则:

# legacy static cache
location /cache/ {
    root /path/to/old_cache_data;
    try_files $uri /empty.png;
}

# pass-through
location / {
    [bunch of proxy-settings]
    proxy_pass [the target url];
}

所以,不确定我到底哪里“拿错了”。它似乎try_files没有在位置上识别root,但不知何故却进行了奇怪的回退。

编辑:我发现将 empty.png 放在“cache”子文件夹中并将 try_files 更改为try_files $uri /cache/empty.png;确实有效。但我不明白为什么会这样。

答案1

正如文档,该try_files指令的最后一个参数可以是

  • 一个新的 URI;
  • HTTP 错误代码:=code
  • 命名位置 ID:@location_name

您正在使用的/empty.pngURI 被视为新的 URI,不掉落因此location /cache { ... }由 提供服务location / { ... }。当您删除前导斜杠时,您将获得新的 URI,empty.png不属于您的任何位置,包括location / { ... }。每个server块都有一些默认根路径prefix/html,其中前缀在编译时间可以使用nginx -V命令进行检查(看起来你的是)。正如指令/usr/所说root文档

只需将 URI 添加到指令的值即可构建文件路径root

这给了我们前缀/usr/+ 默认根/html+ URI empty.png= /usr//htmlempty.png

try_files当您将最后一个参数更改为 时,此 URI 将与文件+ =/cache/empty.png一起提供相同的块。如果您正确理解了以上所有信息,您应该注意到,使用您的配置,您无法访问文件夹中的任何文件,除了子文件夹中的文件。检查两者之间的区别location /cache { ... }/path/to/old_cache_data/cache/empty.png/path/to/old_cache_data/cache/empty.png/path/to/old_cache_data/path/to/old_cache_data/cacherootalias指令以便更好地理解。

相关内容