Nginx可通过全局root或location+alias实现多域名共享静态文件:统一路径时在http块设root;差异化路径时用alias避免拼接错误;配合try_files提升单页应用兼容性。

多个域名想共用同一套静态文件(比如图片、CSS、JS),不需要为每个域名单独复制一份资源,Nginx 的 root 指令配合 server_name 就能轻松实现共享,关键在于把 root 放在 http 或 server 块的合理层级,避免路径重复或错位。
统一 root 放在 http 块最省心
如果所有域名的静态资源都放在同一个物理目录(例如 /var/www/static),直接在 http 块里设置 root,所有 server 块自动继承,无需重复声明:
http {
root /var/www/static; # 全局生效
<pre class="brush:php;toolbar:false;">server {
listen 80;
server_name site-a.com;
# 请求 /logo.png → 映射到 /var/www/static/logo.png
}
server {
listen 80;
server_name site-b.net;
# 同样请求 /logo.png → 也映射到 /var/www/static/logo.png
}}
这样配置简洁,维护方便。注意:此时各 server 内不能再写 root,否则会覆盖全局设置;如有特殊需求需单独指定路径,再在对应 server 里重写即可。
按域名微调 root 路径(用 alias 更安全)
若不同域名需映射到同一父目录下的不同子目录(如 site-a.com 用 /var/www/static/a/,site-b.net 用 /var/www/static/b/),不建议靠 root 拼接,容易出错。更稳妥的是用 location + alias:
-
root是“拼接整个 URI 路径”,比如root /a; location /img/ {...}→ 实际找/a/img/xxx -
alias是“替换 location 匹配部分”,比如alias /a/img/; location /img/ {...}→ 实际找/a/img/xxx,URI 中的/img/被完全替换
示例:
server {
server_name site-a.com;
location /static/ {
alias /var/www/static/a/;
}
}
server {
server_name site-b.net;
location /static/ {
alias /var/www/static/b/;
}避免常见路径陷阱
用 root 时最容易踩的坑是路径多层叠加。例如:
- 错误写法:
root /var/www; location /static { root /var/www/static; }→ 实际查找路径变成/var/www/static/static/xxx - 正确做法:只在一个层级定义
root;若必须嵌套,改用alias或调整location匹配规则 - 测试技巧:开启
error_log /var/log/nginx/error.log debug;,查看实际映射路径,快速定位 404 原因
配合 try_files 提升健壮性
静态资源常和前端路由(如 Vue Router history 模式)共存,可加 try_files 保证:先找真实文件,找不到再交由前端处理:
location / {
try_files $uri $uri/ /index.html;
}这样既服务静态资源,又支持单页应用的跳转,多个域名共享同一套前端代码时特别实用。










