我正在尝试设置 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.png
URI 被视为新的 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/cache
root
和alias
指令以便更好地理解。