nginx的server_name不跳转,仅匹配host头;“别名跳转”需用return 301或rewrite实现:①多域名统一跳转至主域名;②仅别名跳转、主域名正常服务;③正则匹配动态子域跳转。

Nginx 的 server_name 本身不直接“跳转”,它只是匹配请求头中的 Host 字段,用于决定由哪个 server 块处理该请求。所谓“别名跳转”,实际是:用多个域名(别名)指向同一站点,再通过 return 301 或 rewrite 主动重定向到首选域名——这才是用户真正需要的“别名跳转”效果。
下面分三类常见且实用的做法说明:
配置多个域名作为别名,并统一 301 跳转到主域名
适用于 a.com、www.a.com、aaa.com 都想指向同一个站,但只保留一个权威域名(如 www.a.com)。
server {
listen 80;
server_name a.com www.a.com aaa.com;
return 301 https://www.a.com$request_uri;
}
⚠️ 注意:$host 在此处不可靠(IP 直连或恶意 Host 头会导致跳转失败),必须写死目标域名,不能用 $host。
区分主域名与别名,仅对别名做跳转
比如只让 a.com 和 aaa.com 跳转,而 www.a.com 正常提供服务:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
server {
listen 80;
server_name a.com aaa.com;
return 301 https://www.a.com$request_uri;
}
server {
listen 80;
server_name www.a.com;
root /var/www/html;
index index.html;
}
✅ 关键点:Nginx 按 server_name 精确匹配或最长通配符匹配,顺序无关;但必须至少有两个 server 块,否则第一个会被当作默认块,忽略 server_name。
使用正则匹配动态别名(泛解析场景)
例如所有子域都跳转到主站,或排除特定子域:
server {
listen 80;
server_name ~^(?<sub>.+)\.a\.com$;
# 排除 www 和 api 等白名单
if ($sub ~* ^(www|api|cdn)$) {
break;
}
return 301 https://www.a.com$request_uri;
}</sub>
? 提示:
- 正则
server_name性能略低,生产环境慎用高频匹配 -
if在server级可用,但不推荐嵌套复杂逻辑;优先用map+ 变量控制(如需更灵活判断) - 所有跳转务必带上
$request_uri,保留原始路径和参数
不复杂但容易忽略。










