在 try_files 指令中使用 $uri 和 $uri$args 有什么区别

What is difference between using $uri and $uri$args in try_files directive

对于我的其他 Angular 应用程序,我使用以下配置,一切似乎都运行良好。

location / {
     try_files $uri$args $uri$args/ /index.html;
}

现在我正在使用的文件夹在 dist 文件夹中有嵌套文件夹。

文件夹结构如下:

dist \
  -- assets
  -- folder1
     -- folder2
        -- folder3
        -- folder4
        -- folder5
        index.html
  index.html

并且内部 index.html 是使用查询参数调用的,而 url 将类似于 - <ip>/folder1/folder2/index.html?a=1&b=2&c=3。但这是在根位置返回回退 index.html 。后来我把上面的location块改成这样就可以正常使用了

location / {
     try_files $uri $uri/ /index.html;
}

所以我不清楚为什么第一个位置块不起作用。我在文档中找不到任何内容 - try_files

try_files 语句 除了最后一个参数 之外的所有参数都在本地文件系统中查找文件名。

因此,给定 URI /foo/bar,术语 $uri$args 将在 /path/to/root/foo/bar 搜索本地文件,如果不存在,将转到下一个术语或语句末尾的默认子句。

在上述情况下,$args 为空。但是,给定 URI /foo/bar?baz,术语 $uri$args 将在 /path/to/root/foo/barbaz.

搜索本地文件

我不知道为什么有人会在 try_files 语句中使用 $uri$args$uri$args/ 作为文件术语,但很可能有一个合法的用例。

try_files 语句的最后一个参数是特殊的。它可以是状态代码(例如 =404)、要分支到的命名位置或 URI。

对于 URI,Nginx 将内部 重定向到该 URI。一个典型的例子可能是 /index.php$isargs$args - 在这种情况下,附加 $args 参数是完全合法的,因为我们正在创建一个新的 URI 并保留原始参数字符串。

详情见this document