如何为同时包含客户端和服务端代码的项目配置Nginx rewrite规则
现有Apache配置合理性说明
你当前使用的Apache重写规则逻辑完全匹配你提出的转发需求,没有明显问题:
- 第一条规则优先匹配非
/api/开头、带后缀的静态资源,转发到build目录下对应路径,L标记停止后续匹配,逻辑符合要求 - 第二条规则匹配非
/api/开头的非根路径前端路由,全部指向build/index.html,适配单页应用的前端路由需求 - 第三条规则将所有
/api/开头的请求转发到controllers/api下对应路径,QSA保留查询参数、NE不对特殊字符转义,符合接口转发要求
Nginx等效配置
以下配置和你原有Apache规则效果完全一致,使用前请替换路径、域名为你线上服务器的实际值:
server { listen 80; server_name demo.com; # 替换为你的实际线上域名 root /www/wwwroot/demo; # 替换为你项目demo文件夹在服务器上的绝对路径 index index.html index.php; # 处理 /api 开头的接口请求 location ~ ^/api/(.*)$ { rewrite ^/api/(.*)$ /controllers/api/$1 break; } # 处理带后缀的静态资源请求 location ~ .*\.\w+$ { # 排除/api路径下的请求 if ($request_uri !~ ^/api/) { rewrite ^/(.*)$ /build/$1 break; } } # 兜底规则:所有其余请求走前端入口,适配SPA路由 location / { try_files $uri $uri/ /build/index.html; } # PHP解析配置,若使用PHP接口必须补充 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; # 替换为你的php-fpm实际监听地址 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
配置说明
- Nginx的location匹配优先级为「精确匹配 > 正则匹配 > 普通前缀匹配」,上述配置的规则顺序保证接口请求优先命中转发规则,不会被静态资源、前端路由规则覆盖
- 静态资源转发规则增加了
/api路径排除逻辑,避免接口请求被误转发到build目录 - 若部署HTTPS站点,仅需补充443端口监听、SSL证书配置即可,转发规则无需修改
内容的提问来源于stack exchange,提问作者Hao Wu
相关产品推荐
相关产品推荐

