You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx反向代理React Router项目无法访问子路径问题求助

问题根源

你遇到的两个问题分别来自Nginx配置逻辑冲突和前端资源路径配置错误:

  1. 子路径404是因为你的单页应用(SPA)使用前端路由,Nginx没有将未匹配到的路径正确回退到入口index.html
  2. 多级子路径下静态资源加载错误是因为前端打包时未配置根路径的publicPath,导致资源请求使用相对路径,自动拼接了当前路由前缀

修复步骤

第一步:调整前端打包配置

在你前端项目的打包配置(webpack/vite.config.js等)中将publicPath设置为根路径/,示例如下:

  • Vite配置:
export default defineConfig({
  base: '/'
})
  • Webpack配置:
module.exports = {
  publicPath: '/'
}

重新打包后部署到对应目录。

第二步:调整Nginx配置

删除你原有配置中冗余的location ~ ^.+\..+$块,将根location调整为如下逻辑,这里分两种常用场景,注意确认你的应用实际监听端口为4000,不要填错端口号:

场景1:静态资源存放在本地/var/www/domain-app目录,仅前端路由回退和接口请求走4000端口代理

server {
  # gzip
  gzip on;
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;

  # SSL配置,新版本Nginx推荐把ssl参数写在listen行,不需要单独ssl on
  listen 443 ssl;
  listen [::]:443 ssl;
  ssl_certificate /etc/ssl/app.crt;
  ssl_certificate_key /etc/ssl/app.key;

  index index.html;
  server_name app.domain.com;
  proxy_intercept_errors on;
  autoindex off;
  root /var/www/domain-app;

  # 接口请求统一代理到4000端口,根据你实际接口前缀调整,如果没有统一前缀可以省略这个块
  location /api/ {
    proxy_set_header Host $host;
    proxy_pass http://localhost:4000;
    proxy_redirect off;
  }

  location / {
    # 优先匹配本地静态资源,匹配不到的路径回退到index.html交给前端路由处理
    try_files $uri $uri/ /index.html;
  }
}

场景2:所有资源和页面都由4000端口的应用返回

server {
  # gzip
  gzip on;
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;

  listen 443 ssl;
  listen [::]:443 ssl;
  ssl_certificate /etc/ssl/app.crt;
  ssl_certificate_key /etc/ssl/app.key;

  index index.html;
  server_name app.domain.com;
  proxy_intercept_errors on;
  autoindex off;

  location / {
    proxy_set_header Host $host;
    proxy_pass http://localhost:4000;
    proxy_redirect off;
    # 捕获404错误回退到根路径的index.html
    error_page 404 =200 /index.html;
  }
}

第三步:生效配置

修改后执行nginx -t检查配置语法是否正确,确认无误后执行nginx -s reload重载配置即可。

内容的提问来源于stack exchange,提问作者Manuel Etchegaray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:57:03