try_files中命名位置和最后一个参数之间的区别

时间:2019-05-11 06:57:40

标签: nginx

我有以下代码示例:

events {}

http {

   include mime.types;

   server {
      listen 80;
      server_name 172.16.239.128;

      root /sites/demo;

      try_files $uri /cat.png /greet /friendly_404;

      location /friendly_404 {
         return 404 "Sorry, that file could not be found.";
      }

      location /greet {
         return 200 "Hello User";
      }
   }
}

http {

   include mime.types;

   server {
      listen 80;
      server_name 172.16.239.128;

      root /sites/demo;

      try_files $uri /cat.png /greet @friendly_404;

      location @friendly_404 {
         return 404 "Sorry, that file could not be found.";
      }

      location /greet {
         return 200 "Hello User";
      }
   }
}

在第一种情况下,我们使用最后一个参数执行try_files,这被认为是重写权限吗?这意味着我们要使用新的uri /friendly_404重新读取文件,以便正确找到位置?

在第二种情况下,我们使用命名位置,例如,它像bash中的go to一样起作用?对吧?

那么最好使用第二种情况以免重新加载所有文件?

我不确定我所说的话是否正确,经过长时间的网上调查,这是我的结论。

1 个答案:

答案 0 :(得分:0)

try_files ... /uri;的情况下,如果所有 file 词都不匹配,它将执行内部重写,这意味着$uri的值被更改,Nginx重新启动搜索location来处理请求。

对于try_files ... @name;,如果所有 file 词都不匹配,则选择命名的location来处理请求。 $uri的值保持不变。

在一个简单的测试场景中,两者之间可能没有什么区别。

  

那么最好使用第二种情况以免重新加载所有文件?

在两种情况下,这些过程都是Nginx的内部过程,并且不涉及外部重定向。有关详细信息,请参见this document