nginx 通过 location + alias 或 root 实现多目录分层托管:alias 完全替换 url 前缀,适合映射 /static/ 等独立资源路径;root 拼接路径,适用于子应用与目录同名的场景;多 server 块则用于域名级隔离。

Nginx 本身不支持“多目录联合挂载为同一个 URL 根路径”,但可以通过合理使用 location + alias 或 location + root 组合,实现多个物理目录映射到不同 URL 路径下,从而达成静态项目的分层托管效果。关键不是“合并目录”,而是按需路由、精准定位。
用 location + alias 映射独立静态子目录
适合将图片、CSS、JS 等资源分散在不同磁盘或项目目录中,又希望统一通过 /static/、/assets/ 等路径访问。
-
alias 会完全替换 location 匹配路径,所以路径结尾斜杠必须严格匹配;例如
location /images/ { alias /data/pics/; },请求/images/logo.png就对应文件/data/pics/logo.png - 多个 alias 可并存,互不干扰:
location /css/ { alias /srv/front/css/; }
location /js/ { alias /srv/front/js/; }
location /uploads/ { alias /var/www/uploads/; } - 注意:alias 后路径末尾要带 /,且不能与 root 混用在同一 location 中
用 location + root 实现主站+子应用共存
适用于一个主站点(如官网)和多个前端子项目(如后台管理、活动页)共用同一域名但不同路径。
- root 是“拼接”路径,
location /admin/ { root /opt/apps/; }时,请求/admin/index.html对应的是/opt/apps/admin/index.html - 因此子项目目录名必须与 location 路径一致,适合结构清晰、命名可控的部署场景
- 可搭配
try_files $uri $uri/ /admin/index.html;支持 Vue/React 的 history 模式
用多个 server 块做域名级多项目隔离
当不同静态项目逻辑独立、有各自域名(或子域名)时,这是最干净的方式。
- 每个
server块监听相同端口,靠server_name区分请求归属 - 例如:
server { listen 80; server_name app1.example.com; root /var/www/app1; }
server { listen 80; server_name app2.example.com; root /var/www/app2; } - 无需修改前端代码路径,天然支持跨项目资源隔离与权限控制
补充:Docker 场景下的轻量多目录实践
开发测试阶段,不改配置也能快速托管多个静态目录:
- 启动容器时用多个
-v挂载,配合自定义 nginx.conf 引用不同路径:docker run -d -p 8080:80 \<br> -v $(pwd)/site1:/usr/share/nginx/html/site1:ro \<br> -v $(pwd)/site2:/usr/share/nginx/html/site2:ro \<br> -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro \<br> nginx
- 此时 nginx.conf 中只需用
location /site1/ { alias /usr/share/nginx/html/site1/; }即可对外暴露











