Nginx報(bào)錯(cuò)“invalid server name or wildcard”的原因和解決方案
invalid server name or wildcard,
明明就是想用通配符匹配多個(gè)子域,結(jié)果保存不成功,本文就來(lái)一步步講清楚,幫你從根本上解決這個(gè)問題,需要的朋友可以參考下
很多人第一次給網(wǎng)站配置 HTTPS 時(shí),會(huì)遇到一個(gè)看似奇怪的報(bào)錯(cuò):
nginx: [emerg] invalid server name or wildcard "abc-*.example.cn" on 0.0.0.0:80
明明就是想用通配符匹配多個(gè)子域,結(jié)果保存不成功。
這其實(shí)不是語(yǔ)法寫錯(cuò),而是 Nginx 對(duì)通配符的使用范圍有限制。
本文就來(lái)一步步講清楚,幫你從根本上解決這個(gè)問題。
一、問題場(chǎng)景復(fù)現(xiàn)
假設(shè)你有兩個(gè)域名都在同一臺(tái)服務(wù)器上:
https://api.example.cn https://web.example.cn
你在 Nginx 配置時(shí),想著簡(jiǎn)單點(diǎn),寫成:
server_name abc-*.example.cn;
保存時(shí)卻直接報(bào)錯(cuò):
nginx: [emerg] invalid server name or wildcard "abc-*.example.cn" nginx: configuration file test failed
這到底是哪里不對(duì)?
二、錯(cuò)誤原因:Nginx 不支持“中間通配”
Nginx 的通配符(*)規(guī)則是有限制的:
| 寫法 | 是否支持 | 示例 | 說(shuō)明 |
|---|---|---|---|
*.example.cn | ? 支持 | 匹配 api.example.cn、web.example.cn | ? 通配符必須在最左邊 |
example.* | ? 支持 | 匹配 example.cn、example.com | ? 通配符可以在最右邊 |
abc-*.example.cn | ? 不支持 | 想匹配 abc-web.example.cn、abc-api.example.cn | ? 通配符不能出現(xiàn)在中間 |
也就是說(shuō),你寫的 abc-*.example.cn 是 非法的寫法。
Nginx 不知道如何去匹配這類模式,因此直接拒絕加載。
三、正確寫法與最佳實(shí)踐
根據(jù)你的實(shí)際需求,有幾種安全可行的方式:
方案一:直接列出多個(gè)域名(最推薦)
如果只是幾個(gè)固定域名,比如:
api.example.cn web.example.cn
那就直接列出來(lái):
server_name api.example.cn web.example.cn;
這樣寫最清晰、兼容性最好,也不會(huì)報(bào)錯(cuò)。
方案二:使用標(biāo)準(zhǔn)通配符(同一層級(jí))
如果你確實(shí)想讓一個(gè)配置同時(shí)匹配多個(gè)子域(例如網(wǎng)站很多個(gè)):
server_name *.example.cn;
這表示它可以匹配:
api.example.cnweb.example.cncdn.example.cn
但注意:
- 它只匹配一級(jí)子域(
xxx.example.cn), - 不會(huì)匹配多層結(jié)構(gòu)(如
a.api.example.cn)。
方案三:多個(gè)項(xiàng)目共用證書但分開配置
比如你同一臺(tái)服務(wù)器上部署了:
api.example.cnweb.example.cn
而另一臺(tái)服務(wù)器有:
shop.example.cn
這種情況下,你可以讓每臺(tái)服務(wù)器都使用同一張通配符證書(*.example.cn),
但在各自的 Nginx 里寫?yīng)毩⑴渲茫?/p>
在服務(wù)器 A
server_name api.example.cn web.example.cn;
在服務(wù)器 B
server_name shop.example.cn;
這樣能共用證書,又不會(huì)讓不同機(jī)器互相干擾。
四、完整可用示例(兩個(gè)域名在同一臺(tái)服務(wù)器)
下面這份配置可以直接用在寶塔或手動(dòng)編輯中:
# HTTP 自動(dòng)跳轉(zhuǎn) 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;
# 根據(jù)訪問的域名切換網(wǎng)站目錄
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;
}
五、證書建議
為了同時(shí)支持多個(gè)子域名:
- 建議使用 通配符證書:
*.example.cn - 在簽發(fā)時(shí)選擇 DNS 驗(yàn)證 模式(HTTP 驗(yàn)證無(wú)法驗(yàn)證通配符)
- 同一張證書可以放在多臺(tái)服務(wù)器上使用,只要路徑一致即可。
六、總結(jié)
| 問題 | 原因 | 正確做法 |
|---|---|---|
| 報(bào)錯(cuò) “invalid server name or wildcard” | 通配符出現(xiàn)在中間(abc-*.example.cn) | 改為具體域名或標(biāo)準(zhǔn)通配(*.example.cn) |
| 想匹配多個(gè)域名 | 可以空格分開多個(gè)域名 | server_name api.example.cn web.example.cn; |
| 想共用 HTTPS 證書 | 使用 *.example.cn 通配符證書 | 多個(gè)子域共用 |
| 不同服務(wù)器不同站點(diǎn) | 各自獨(dú)立配置 | 不互相影響 |
結(jié)語(yǔ)
如果你是第一次配置 HTTPS,建議遵循這兩條經(jīng)驗(yàn)法則:
寫具體域名最安全;通配符只能在最左邊。
只要掌握這兩條,99% 的 Nginx 報(bào)錯(cuò)都能一次解決。
以上就是Nginx報(bào)錯(cuò)“invalid server name or wildcard”的原因和解決方案的詳細(xì)內(nèi)容,更多關(guān)于Nginx報(bào)錯(cuò)invalid server name or wildcard的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 解決systemctl reload nginx重啟Nginx服務(wù)報(bào)錯(cuò):Job for nginx.service invalid問題
- nginx報(bào)錯(cuò)upstream sent invalid header的解決
- Nginx 502 Bad Gateway報(bào)錯(cuò)原因解析與解決方案
- 解決Nginx啟動(dòng)報(bào)錯(cuò)Job for nginx.service failed because the control process exited with error code問題
- NGINX 報(bào)錯(cuò) 413 Request Entity Too Large的問題解決
- Nginx報(bào)錯(cuò)"Too many open files"問題的深度解析與解決方案
相關(guān)文章
Nginx使用反向代理實(shí)現(xiàn)負(fù)載均衡過(guò)程解析
這篇文章主要介紹了Nginx使用反向代理實(shí)現(xiàn)負(fù)載均衡過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Nginx利用Lua+Redis實(shí)現(xiàn)動(dòng)態(tài)封禁IP的方法
在站點(diǎn)遇到攻擊且無(wú)明顯攻擊特征,造成站點(diǎn)訪問慢,nginx不斷返回502等錯(cuò)誤時(shí),可利用nginx+lua+redis對(duì)該IP進(jìn)行封禁,這篇文章主要給大家介紹了關(guān)于Nginx利用Lua+Redis實(shí)現(xiàn)動(dòng)態(tài)封禁IP的相關(guān)資料,需要的朋友可以參考下2018-12-12
Nginx 代理轉(zhuǎn)發(fā)阿里云OSS上傳的實(shí)現(xiàn)代碼
這篇文章主要介紹了Nginx 代理轉(zhuǎn)發(fā)阿里云OSS上傳的實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
Python的Bottle框架基本知識(shí)總結(jié)
這篇文章主要介紹了Python的Bottle框架基本知識(shí)總結(jié),本文翻譯自Bottle官方開發(fā)文檔,需要的朋友可以參考下2015-05-05
Nginx負(fù)載均衡/SSL配置的實(shí)現(xiàn)
這篇文章主要介紹了Nginx負(fù)載均衡/SSL配置的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
nginx容器配置文件獨(dú)立的實(shí)現(xiàn)
本文主要介紹了nginx容器配置文件獨(dú)立,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
采用ngxtop實(shí)現(xiàn)nginx實(shí)時(shí)訪問數(shù)據(jù)統(tǒng)計(jì)
這篇文章主要介紹了采用ngxtop實(shí)現(xiàn)nginx實(shí)時(shí)訪問數(shù)據(jù)統(tǒng)計(jì),需要的朋友可以參考下2014-07-07
Nginx實(shí)現(xiàn)接口復(fù)制的示例代碼
本文主要介紹了使用Nginx的mirror指令和Lua腳本實(shí)現(xiàn)接口流復(fù)制,方便將請(qǐng)求同時(shí)轉(zhuǎn)發(fā)到多個(gè)后端服務(wù)器,具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01
nginx學(xué)習(xí)總結(jié)五(nginx反向代理)
Nginx代理與負(fù)載均衡配置與優(yōu)化技巧,方便需要的朋友2012-11-11

