一个域名下挂多个虚拟目录本质是通过Nginx的location指令,将不同URL路径前缀(如/admin/、/api/)分别映射至不同物理路径或后端服务;常用alias(剥离前缀,适配SPA)、root(拼接路径,适配静态子站)、proxy_pass(转发至后端,需注意末尾/)三种方式实现,并须校验权限、路径存在性及日志报错。

一个域名下挂多个虚拟目录,本质是让同一 server 块内不同 URL 路径前缀(如 /admin/、/api/、/static/)指向服务器上**不同的物理路径或后端服务**,而不是开多个站点。核心靠 location 指令配合 alias、root 或 proxy_pass 实现。
用 alias 挂载独立前端子应用(推荐 Vue/React)
适合已打包好的 SPA 项目,要求 URL 前缀被完全剥离:
-
location必须以/结尾(如/admin/),alias后也必须带末尾斜杠(如/var/www/admin/) - 访问
/admin/js/app.js→ 实际读取/var/www/admin/js/app.js(/admin/被去掉) - 对应 Vue 项目需设
publicPath: "/admin/",否则静态资源 404 - 加
try_files $uri $uri/ /admin/index.html;支持 History 模式刷新
用 root 挂载同构子目录(适合简单静态页)
适合把多个小站放在同一父目录下,结构清晰但路径会自动拼接:
-
location /blog/ { root /var/www; }→ 请求/blog/index.html对应文件是/var/www/blog/index.html - 不适用于已打包的独立 SPA(多出一层目录层级,资源路径易错)
- 适合
/docs/、/blog/这类内容结构与 URL 一致的静态子站
用 proxy_pass 接入不同后端服务
当虚拟目录实际对应不同后端(如 Java、Node.js、Python 服务)时:
-
location /user-api/ { proxy_pass http://127.0.0.1:8081/; }(注意末尾/,用于剥离前缀) location /order-service/ { proxy_pass http://127.0.0.1:9002/; }- 确保后端服务不依赖原始路径前缀,或在代码中统一处理 context path
- 建议加
proxy_set_header X-Forwarded-Prefix /user-api;供后端识别入口路径
配置后必须检查的三件事
写对 ≠ 跑通:
-
权限:Nginx 工作用户(如
www-data)对目标目录有r-x权限;父目录至少要有执行(x)权限才能进入 -
路径真实存在:
alias后必须是绝对路径,且该目录已创建、非空(Nginx 不会自动建目录) -
日志验证:开启
error_log /var/log/nginx/error.log notice;,看报错是否提示 “No such file or directory”,确认实际访问路径是否符合预期


















