nginx - 前缀匹配中的连字符会混淆try_files吗?

nginx - 前缀匹配中的连字符会混淆try_files吗?

语境

我正在使用 nginx 和简单的前缀匹配来为单页应用程序提供服务。为了符合业务的样式指南,url 应该带连字符 ( https://host.tld/my-app)。

我使用 nginx docker 镜像作为基础,因此我的(部分)服务器配置非常简单:

server {
  listen 80;
  root /usr/share/nginx/html;

  location /my-app {
    root /usr/share/nginx/html/my-app;
    try_files /$uri /$uri.html /$uri/ /index.html =404;
  }
}

生产资产存在于 之内/usr/share/nginx/html/my-app

编辑:我刚刚发现这个问题仅在本地运行我的容器时发生,即当主机是本地主机并且端口被映射时。我的配置似乎在生产中有效。不过,我很好奇为什么会发生这种情况。

问题

当我使用上述位置前缀(带连字符)时,我的浏览器似乎收到了各种请求的错误文件。例如:

Uncaught SyntaxError: Unexpected token '<'main.71992375.chunk.js:1

将 html 解释为 javascript 导致的语法错误

通过检查文件,main.71992375.chunk.js:1我实际上看到了我的index.html

错误文件在位置中带有连字符

我通过实验确定,只需将位置前缀更改为使用下划线(https://host.tld/my_app)即可完全解决问题。

正确的文件在位置上带有下划线

尝试的解决方案

以下是我尝试过的一些解决方案(尽管没有一个能让我满意地解决问题)

  • 使用正则表达式匹配location ~ /my[-]app {(同样的症状 - 在预期的 URL 上提供错误的文件https://host.tld/my-app
  • 更改根目录以不使用连字符(担心 nginx 在这种情况下会失败,但似乎没有什么区别)
  • 使用下划线(提供正确的文件,但不是解决方案,因为我需要使用连字符)

请让我知道我在这里做错了什么。当然有一种方法可以使用 nginx 的连字符位置。提前谢谢您!

答案1

您的配置

location /my-app {
    root /usr/share/nginx/html/my-app;
}

使 nginx 在目录中查找文件/usr/share/nginx/html/my-app/my-app。这是因为 nginx 将规范化的 URI 附加到location中指定的路径末尾root

如果你希望/usr/share/nginx/html/my-app/test.html在请求时提供服务http://example.com/my-app/test.html,那么你的配置需要是:

location /my-app {
    root /usr/share/nginx/html;
    try_files $uri $uri.html $uri/ /index.html =404;
}

相关内容