我尝试在“服务器”块中使用 nignx try_files。我遇到了这个问题:Nginx try_files 在服务器块内不起作用
我的用例有所不同,因为位置块中只有缓存标头设置:
server {
listen 80;
root /app;
index index.html;
try_files $uri $uri/ /index.html;
location /assets/ {
add_header "Cache-Control" "public";
expires 1d;
}
location / {
add_header "Cache-Control" "no-cache";
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
我已经读过了nginx 如何处理请求,但我还是不明白为什么它不起作用。
在上述问题的评论中,有人提到try_files已被移至ngx_http_try_files_module。
在 nginx 文档页面上,我找不到该模块,并且 try_files 仍然记录在核心模块中:https://nginx.org/en/docs/http/ngx_http_core_module.html#try_files
据此,try_files 可以在服务器块中使用,所以我不明白为什么我的配置不起作用。
有人可以解释/指出我正确的方向吗?
答案1
try_files
location
将在选择处理请求的块中执行。
块try_files
中的server
仅有的location
如果没有找到匹配项,则执行。
由于location /
您的配置中存在总是是匹配的,location
所以try_files
server
绝不被处决。
复制try_files
到每个location
需要它的块中。
答案2
我终于找到了一篇很好的文章来解释这一点:
try_files 指令与上面提到的其他所有操作指令基本相同,不同之处在于,如果将其放置在服务器上下文中,nginx 实际上会创建一个伪位置,该伪位置是最不具体的位置。这意味着,如果请求与定义的位置匹配,则不会执行 try_files 指令。这意味着,如果您定义了 location /,那么您就拥有一个与所有可能请求匹配的位置,因此 try_files 永远不会真正执行。因此,如果可能的话,请始终将 try_files 放置在位置上下文中,而不是服务器上下文中。
它还包含一些关于 nginx 上下文块(全局、http、服务器、位置等)之间继承如何运作的信息,对于不同类型的指令有不同的工作方式。
看:https://blog.martinfjordvald.com/understanding-the-nginx-configuration-inheritance-model/