服务器块中的 Nginx try_files 似乎不起作用

服务器块中的 Nginx try_files 似乎不起作用

我尝试在“服务器”块中使用 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_fileslocation将在选择处理请求的块中执行。

try_files中的server仅有的location如果没有找到匹配项,则执行。

由于location /您的配置中存在总是是匹配的,location所以try_filesserver绝不被处决。

复制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/

相关内容