可通过nginx的location匹配路径前缀配合proxy_pass或alias实现单域名下多子系统虚拟路径隔离(如/admin/、/api/),必要时用rewrite修正uri;需确保后端适配前缀或通过rewrite去除,静态资源用alias,spa需配置try_files fallback及正确publicpath。

在单域名下通过 Nginx 的 rewrite 和 location 配合,可以将不同子系统映射到各自的虚拟路径(如 /admin/、/api/、/portal/),实现逻辑隔离,而无需多个域名或端口。核心不是单纯靠 rewrite 跳转,而是用 location 匹配路径前缀 + proxy_pass 或 alias 实现后端路由分发,必要时辅以 rewrite 修正请求 URI。
明确子系统路径前缀并配置 location 分段
每个子系统应有唯一、无歧义的 URL 前缀(如 /admin/、/backend/),避免前缀互相包含(例如不要同时用 /api/ 和 /api-v2/,除非显式区分)。Nginx 按最长匹配原则选择 location,所以带尾斜杠的前缀更安全:
-
location /admin/ { ... }→ 匹配所有以/admin/开头的请求 -
location /api/ { ... }→ 独立转发到 API 服务 - 不写成
location /admin(无尾斜杠),否则会错误匹配/administer
后端服务需适配虚拟路径(关键细节)
子系统代码通常假设部署在根路径(/),但实际访问路径是 /admin/xxx。必须让后端正确解析资源路径和跳转地址:
- 若用
proxy_pass http://127.0.0.1:8001;,Nginx 默认透传原始 URI(含/admin/),后端需能处理带前缀的请求;否则需用rewrite去掉前缀再代理 - 推荐写法:
location /admin/ { rewrite ^/admin/(.*)$ /$1 break; proxy_pass http://127.0.0.1:8001; }—— 把/admin/abc改写为/abc再转发 - 静态文件服务(如 Vue 打包产物)用
alias更合适:location /portal/ { alias /var/www/portal/; }(注意alias要求路径末尾带斜杠)
处理前端路由(如 Vue Router history 模式)
当子系统是 SPA,且使用 history 模式时,直接访问 /admin/user/profile 会 404(Nginx 找不到对应文件)。需在对应 location 内 fallback 到 index.html:
location /admin/ { alias /var/www/admin/; try_files $uri $uri/ /admin/index.html; }-
try_files中的/admin/index.html必须与alias路径一致,否则找不到文件 - 确保前端构建时设置了
publicPath: '/admin/',使 JS/CSS 资源正确加载
避免重写冲突与常见陷阱
多个 rewrite 规则叠加易出错,优先用 location 分流,仅在必要时改写 URI:
-
rewrite在location内执行时,break终止当前 location 的后续处理,last重新匹配 location —— 多数场景用break - 不要在
server块顶层大量写rewrite,易导致循环或覆盖 - 调试技巧:开启
error_log /var/log/nginx/rewrite.log notice;,加rewrite_log on;查看重写过程











