Nginx报错“invalid server name or wildcard”的原因和解决方案
作者:一勺菠萝丶
invalid server name or wildcard,
明明就是想用通配符匹配多个子域,结果保存不成功,本文就来一步步讲清楚,帮你从根本上解决这个问题,需要的朋友可以参考下
很多人第一次给网站配置 HTTPS 时,会遇到一个看似奇怪的报错:
nginx: [emerg] invalid server name or wildcard "abc-*.example.cn" on 0.0.0.0:80
明明就是想用通配符匹配多个子域,结果保存不成功。
这其实不是语法写错,而是 Nginx 对通配符的使用范围有限制。
本文就来一步步讲清楚,帮你从根本上解决这个问题。
一、问题场景复现
假设你有两个域名都在同一台服务器上:
https://api.example.cn https://web.example.cn
你在 Nginx 配置时,想着简单点,写成:
server_name abc-*.example.cn;
保存时却直接报错:
nginx: [emerg] invalid server name or wildcard "abc-*.example.cn" nginx: configuration file test failed
这到底是哪里不对?
二、错误原因:Nginx 不支持“中间通配”
Nginx 的通配符(*)规则是有限制的:
| 写法 | 是否支持 | 示例 | 说明 |
|---|---|---|---|
*.example.cn | ✅ 支持 | 匹配 api.example.cn、web.example.cn | ✅ 通配符必须在最左边 |
example.* | ✅ 支持 | 匹配 example.cn、example.com | ✅ 通配符可以在最右边 |
abc-*.example.cn | ❌ 不支持 | 想匹配 abc-web.example.cn、abc-api.example.cn | ❌ 通配符不能出现在中间 |
也就是说,你写的 abc-*.example.cn 是 非法的写法。
Nginx 不知道如何去匹配这类模式,因此直接拒绝加载。
三、正确写法与最佳实践
根据你的实际需求,有几种安全可行的方式:
方案一:直接列出多个域名(最推荐)
如果只是几个固定域名,比如:
api.example.cn web.example.cn
那就直接列出来:
server_name api.example.cn web.example.cn;
这样写最清晰、兼容性最好,也不会报错。
方案二:使用标准通配符(同一层级)
如果你确实想让一个配置同时匹配多个子域(例如网站很多个):
server_name *.example.cn;
这表示它可以匹配:
api.example.cnweb.example.cncdn.example.cn
但注意:
- 它只匹配一级子域(
xxx.example.cn), - 不会匹配多层结构(如
a.api.example.cn)。
方案三:多个项目共用证书但分开配置
比如你同一台服务器上部署了:
api.example.cnweb.example.cn
而另一台服务器有:
shop.example.cn
这种情况下,你可以让每台服务器都使用同一张通配符证书(*.example.cn),
但在各自的 Nginx 里写独立配置:
在服务器 A
server_name api.example.cn web.example.cn;
在服务器 B
server_name shop.example.cn;
这样能共用证书,又不会让不同机器互相干扰。
四、完整可用示例(两个域名在同一台服务器)
下面这份配置可以直接用在宝塔或手动编辑中:
# HTTP 自动跳转 HTTPS
server {
listen 80;
server_name api.example.cn web.example.cn;
return 301 https://$host$request_uri;
}
# HTTPS 配置
server {
listen 443 ssl http2;
server_name api.example.cn web.example.cn;
ssl_certificate /www/server/panel/vhost/cert/example.cn/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/example.cn/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
add_header Strict-Transport-Security "max-age=31536000";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
# 根据访问的域名切换网站目录
if ($host = api.example.cn) {
root /www/wwwroot/api.example.cn/dist;
}
if ($host = web.example.cn) {
root /www/wwwroot/web.example.cn/dist;
}
index index.html index.htm;
try_files $uri $uri/ /index.html;
access_log /www/wwwlogs/https-access.log;
error_log /www/wwwlogs/https-error.log;
}
五、证书建议
为了同时支持多个子域名:
- 建议使用 通配符证书:
*.example.cn - 在签发时选择 DNS 验证 模式(HTTP 验证无法验证通配符)
- 同一张证书可以放在多台服务器上使用,只要路径一致即可。
六、总结
| 问题 | 原因 | 正确做法 |
|---|---|---|
| 报错 “invalid server name or wildcard” | 通配符出现在中间(abc-*.example.cn) | 改为具体域名或标准通配(*.example.cn) |
| 想匹配多个域名 | 可以空格分开多个域名 | server_name api.example.cn web.example.cn; |
| 想共用 HTTPS 证书 | 使用 *.example.cn 通配符证书 | 多个子域共用 |
| 不同服务器不同站点 | 各自独立配置 | 不互相影响 |
结语
如果你是第一次配置 HTTPS,建议遵循这两条经验法则:
写具体域名最安全;通配符只能在最左边。
只要掌握这两条,99% 的 Nginx 报错都能一次解决。
以上就是Nginx报错“invalid server name or wildcard”的原因和解决方案的详细内容,更多关于Nginx报错invalid server name or wildcard的资料请关注脚本之家其它相关文章!
您可能感兴趣的文章:
- 解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题
- nginx报错upstream sent invalid header的解决
- Nginx 502 Bad Gateway报错原因解析与解决方案
- 解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题
- NGINX 报错 413 Request Entity Too Large的问题解决
- Nginx报错"Too many open files"问题的深度解析与解决方案
