Nginx多环境静态资源映射关键在于map+root或try_files+分层目录:map在http块预定义$host到路径映射,location中root $env_root自动拼接;或用正则提取环境名,try_files按序查找/var/www/{env}/下文件,二者均规避root动态化限制。

配置 Nginx 处理多环境静态资源映射,关键不是让 root 直接读取动态变量(它不支持),而是通过条件预判 + 路径拼接 或 分层目录 + 优先查找 的方式实现。常用且稳定的做法有两种:用 map 指令绑定环境变量再配合 root,或用 try_files 配合固定 root 和路径嵌套结构。
用 map + root 实现域名级环境隔离
适合不同环境使用不同子域名(如 dev.example.com、test.example.com、prod.example.com)的场景。先在 http 块中定义映射关系,再在 location 中引用:
-
map必须写在http块内,不能放在server或location中 - 每个匹配规则对应一个物理目录,比如
/var/www/dev、/var/www/test -
root $env_root会自动拼上location的路径,例如location /static/+root /var/www/dev→ 实际找的是/var/www/dev/static/
示例配置:
map $host $env_root {
default "/var/www/prod";
~^dev\.example\.com$ "/var/www/dev";
~^test\.example\.com$ "/var/www/test";
}
server {
listen 80;
server_name example.com dev.example.com test.example.com;
location /static/ {
root $env_root;
expires 1h;
add_header Cache-Control "public";
}
}
用 try_files + 分层目录实现路径级环境切换
适合所有环境共用一个域名,但 URL 中带环境标识(如 /dev/js/app.js、/prod/css/main.css)的情况。此时 root 固定,靠 try_files 按顺序查找对应子目录:
- 目录结构需提前规划好,例如:
/var/www/dev/、/var/www/test/、/var/www/prod/ -
location中用正则提取环境名,再用try_files逐个尝试路径 - 避免漏配,建议末尾加
=404明确失败响应
示例配置:
location ~ ^/(?<env>dev|test|prod)/(.*)$ {
root /var/www;
try_files /$env/$2 /$env/$2/ =404;
}
访问 /dev/js/app.js 时,Nginx 会依次检查:/var/www/dev/js/app.js → /var/www/dev/js/app.js/ → 返回 404。
注意 root 和 alias 在多环境中的误用风险
很多人想用 alias 动态替换路径,但 alias 不支持变量拼接(如 alias /var/www/$env/; 是非法的)。所以多环境映射应优先选 map + root,而不是强行用 alias。另外要牢记:
-
root /data+location /static/→ 查找/data/static/xxx -
alias /data/static/+location /static/→ 查找/data/static/xxx(去掉了 location 前缀) - 如果用
alias,结尾斜杠/必须存在,否则 404
补充:静态资源缓存与安全建议
多环境部署后,别忽略缓存策略和路径安全:
- 开发环境建议禁用缓存:
expires off; add_header Cache-Control "no-store" - 生产环境设置合理过期时间:
expires 1y; add_header Cache-Control "public" - 防止目录遍历,尤其在开放
autoindex on时,加上disable_symlinks on; - 若资源路径含敏感前缀(如
/admin/),建议配合auth_basic做基础认证


















