From efb9d6c57f37dcd7c4015d73058c97acefe9949e Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Sat, 4 Jul 2026 17:30:12 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20nginx=20SPA=E8=B7=AF=E7=94=B1=E7=A7=BB?= =?UTF-8?q?=E9=99=A4$uri/=EF=BC=8C=E9=81=BF=E5=85=8D/assets=E7=AD=89?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E8=A2=AB=E5=BD=93=E6=88=90=E9=9D=99=E6=80=81?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E8=BF=94=E5=9B=9E403?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题根因: - try_files $uri $uri/ /index.html 中的 $uri/ 会匹配与构建产物目录同名的路由 - Vite 默认将静态资源放在 assets/ 目录下 - 访问 /assets 时,$uri/ 匹配到 assets/ 目录,Nginx 尝试目录访问返回 403 - 类似的路径冲突还有 /dashboard /history 等如果有同名目录也会出问题 修复方案: - 移除 $uri/,改为 try_files $uri /index.html - 真实存在的静态文件(如 /assets/index-abc.js)仍然能通过 $uri 正确返回 - 前端路由路径统一 fallback 到 index.html 由 SPA 路由处理 影响范围:nginx.conf / nginx-production.conf / nginx-staging.conf 三个文件 --- infra/docker/nginx-production.conf | 3 ++- infra/docker/nginx-staging.conf | 3 ++- infra/docker/nginx.conf | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) mode change 100644 => 100755 infra/docker/nginx-production.conf mode change 100644 => 100755 infra/docker/nginx-staging.conf mode change 100644 => 100755 infra/docker/nginx.conf diff --git a/infra/docker/nginx-production.conf b/infra/docker/nginx-production.conf old mode 100644 new mode 100755 index f03b38263..f9fdef9ae --- a/infra/docker/nginx-production.conf +++ b/infra/docker/nginx-production.conf @@ -13,8 +13,9 @@ server { client_max_body_size 800m; # SPA routing - all routes to index.html + # 注意:不能加 $uri/,否则 /assets 等与构建产物目录同名的路由会被当成目录访问,返回 403 location / { - try_files $uri $uri/ /index.html; + try_files $uri /index.html; } # API proxy diff --git a/infra/docker/nginx-staging.conf b/infra/docker/nginx-staging.conf old mode 100644 new mode 100755 index 56d7502aa..f3735ba18 --- a/infra/docker/nginx-staging.conf +++ b/infra/docker/nginx-staging.conf @@ -13,8 +13,9 @@ server { client_max_body_size 800m; # SPA routing - all routes to index.html + # 注意:不能加 $uri/,否则 /assets 等与构建产物目录同名的路由会被当成目录访问,返回 403 location / { - try_files $uri $uri/ /index.html; + try_files $uri /index.html; } # API proxy diff --git a/infra/docker/nginx.conf b/infra/docker/nginx.conf old mode 100644 new mode 100755 index c1a87006b..601ebaa75 --- a/infra/docker/nginx.conf +++ b/infra/docker/nginx.conf @@ -23,8 +23,9 @@ server { client_max_body_size 800m; # SPA routing - all routes to index.html + # 注意:不能加 $uri/,否则 /assets 等与构建产物目录同名的路由会被当成目录访问,返回 403 location / { - try_files $uri $uri/ /index.html; + try_files $uri /index.html; } # API proxy