应配置 default_server 块实现兜底跳转:http 用 listen 80 default_server + server_name _ + return 302;https 需单独配 listen 443 ssl default_server 并提供有效证书,均保留 $request_uri 实现路径参数透传。

直接在 Nginx 中拦截所有未明确定义的二级域名,并统一 302 跳转到官网,关键在于利用 server_name 的匹配优先级 和 默认 server 块 的机制,而不是靠正则或 if 判断——后者易出错且性能差。
配置一个兜底的 default server
Nginx 会将不匹配任何显式 server_name 的请求,交给监听相同端口、且标记为 default_server 的 server 块处理。这是最可靠、最轻量的兜底方式。
- 确保你的官网已有正常运行的 server 块(比如
server_name www.example.com example.com) - 新增一个监听 80 端口的 default_server 块,放在所有其他 server 块之前(Nginx 按配置顺序匹配,default_server 必须显式声明且唯一)
- 该块不写具体
server_name,或仅写一个占位符如_,并用default_server标识
写法示例(HTTP 80 端口)
在 /etc/nginx/conf.d/default-redirect.conf 中添加:
server {
listen 80 default_server;
server_name _;
return 302 https://www.example.com$request_uri;
}
说明:
– listen 80 default_server 表示此块是 80 端口的默认入口
– server_name _ 是 Nginx 推荐的“无效域名”占位符,语义清晰且无副作用
– $request_uri 保留原始路径和查询参数,跳转更友好(如 xxx.badsub.example.com/abc?x=1 → https://www.example.com/abc?x=1)
HTTPS 场景需单独配置 default_server
443 端口不能复用 80 的 default_server,必须另配一个:
- 同样使用
listen 443 ssl default_server - 需提供有效的 SSL 证书(哪怕只是自签名,否则浏览器会报证书错误中断跳转)
- 证书可复用官网已有的,或申请通配符证书(
*.example.com),但注意:通配符不匹配根域名,所以仍需单独配www.example.com和example.com
示例:
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
return 302 https://www.example.com$request_uri;
}
验证与注意事项
配置后务必执行:
-
sudo nginx -t检查语法 -
sudo systemctl reload nginx平滑重载(避免连接中断) - 用 curl 测试:
curl -I -H "Host: fake.random.example.com" http://your-server-ip,应返回302及正确Location头
注意:
– 不要对 server_name 使用通配符(如 *.example.com)来“覆盖”非法子域,它会匹配所有合法二级域,反而破坏原有配置
– 避免在 default server 中写 if ($host !~ ...),既低效又容易漏判或误判
– 若官网本身也走 HTTPS,建议所有跳转都指向 https://,避免中间出现 HTTP 明文跳转











