Nginx 的 server_name 本身不支持子路径中直接复用域名变量,但可通过 $host、$server_name 和 map 指令在 location 中动态引用域名实现路径构造、代理或重写。

Nginx 的 server_name 本身不直接提供“子路径中复用域名变量”的能力,但它配合 $host、$server_name 和 map 指令,可以实现在 location 块或 proxy_pass、root 等指令中动态引用域名信息,从而在子路径逻辑里灵活使用。
关键不是让 server_name “出现在子路径里”,而是把域名作为变量,在路径构造、重写或代理中复用。下面分几种典型场景说明:
用 $host 动态拼接子路径的 root 目录
适合多域名共用一套 Nginx 配置,但静态资源按域名隔离存放(如 /var/www/$host/):
server {
listen 80;
server_name example.com www.example.com demo.org;
# 注意:root 不支持变量在 location 外直接使用,需放在 location 内或用 alias
location / {
root /var/www/$host;
index index.html;
}
}⚠️ 注意:root 在 server 级使用变量是不安全且不可靠的(Nginx 早期版本可能报错或行为异常)。更稳妥做法是:
- 把
root移到location /内(如上),或 - 改用
alias+ 显式路径映射,或 - 用
map提前定义域名到路径的映射(推荐用于多域名)。
用 map 统一管理域名 → 路径映射(推荐)
适用于多个域名对应不同子目录,且希望配置清晰、易维护:
http {
map $host $site_root {
default "/var/www/default";
example.com "/var/www/example-com";
www.example.com "/var/www/example-com";
demo.org "/var/www/demo-org";
~^([a-z0-9\-]+)\.demo\.org$ "/var/www/demo-org/$1";
}
server {
listen 80;
server_name example.com www.example.com demo.org;
location / {
root $site_root;
index index.html;
}
}
}✅ 这样 $site_root 就是“复用后的域名变量”,可在任意 location 中用于 root、alias、甚至 proxy_pass 构造路径。
在子路径中重写或跳转时引用域名
比如把 /api/ 请求转发到后端,并带上原始域名标识:
location /api/ {
proxy_pass https://backend/api/;
proxy_set_header X-Original-Host $host;
# 或动态改写 path,例如加域名前缀
rewrite ^/api/(.*)$ /api/$host/$1 break;
}Vue/React 单页应用中动态 publicPath(前端配合)
如果子路径是前端路由(如 /app/),而 JS/CSS 需按域名加载不同 CDN:
- Nginx 可注入
<script>片段:location /index.html { add_before_body '<script>__webpack_public_path__ = "https://' $host '/assets/";</script>'; } - 或在
location /assets/中用$host控制静态资源来源(如反向代理到对应 CDN 域名)。
总结几个要点:
-
server_name是匹配入口,不参与路径生成;真正能“复用”的是$host、$server_name和自定义map变量 - 所有涉及变量的路径指令(如
root、proxy_pass、rewrite)必须确保上下文支持——map定义在http块,变量才全局可用 - 避免在
server块顶层直接用$host设置root,容易因变量未初始化导致 404 - 多域名共用逻辑时,优先用
map+include组合,比复制多个server块更健壮
不复杂但容易忽略。


















