语境
我正在使用 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
通过检查文件,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;
}