最有效方式是直接检查server_name值是否符合Nginx命名规范:仅允许字母、数字、-、.、*、~,禁用下划线、空格、中文及特殊符号;结合error.log定位行号,用grep等命令筛查非法字符,并验证通配符与正则格式合规性。

直接检查 server_name 指令的值是否符合 Nginx 的命名规范,是排查非法字符最有效的方式。Nginx 对 server_name 有明确限制:只允许字母、数字、连字符(-)、点号(.)和通配符(*、~),且不能以连字符或点号开头或结尾,也不能包含下划线(_)、空格、中文、特殊符号(如 @、/、!、? 等)。
看错误日志定位具体行
Nginx 在加载配置时若遇到非法字符,通常会在 error.log 中报类似错误:
注意关键词 invalid server_name 和具体文件路径+行号。立即打开对应文件的该行,重点检查引号内的内容。
- 用
grep -n "server_name" /path/to/conf快速定位所有server_name行 - 逐行检查是否含下划线(常见误写:
api_v1.example.com)、中文域名(未转 Punycode)、空格或制表符 - 特别注意从宝塔、脚本或复制粘贴进来的配置——容易带不可见 Unicode 字符(如零宽空格、BOM 头)
用命令行辅助检测非法字符
对可疑配置文件执行以下检查,能快速暴露问题:
- 查下划线:
grep -n "_" /www/server/panel/vhost/nginx/*.conf - 查非 ASCII 字符(含中文、全角标点):
grep -nP "[^\x00-\x7F]" /etc/nginx/conf.d/*.conf - 查控制字符或空格干扰:
cat -A /etc/nginx/conf.d/site.conf | grep -n "server_name"(cat -A会显示^I表示 tab,$表示行尾,方便识别隐藏符)
确认通配符与正则写法是否合规
server_name 支持通配符和正则,但格式必须严格:
- 通配符只能出现在开头或结尾:
*.example.com✅,sub.*.com❌ - 正则必须以
~开头,且整个值需用引号包裹:server_name ~^([a-z0-9\-]+)\.example\.com$;✅ - 漏掉
~或引号不闭合,会被当作普通域名解析,从而触发非法字符报错
临时简化验证法
如果无法快速定位,可做最小化验证:
- 注释掉所有
server_name行,仅保留server_name _;(这是 Nginx 接收任意 Host 的兜底写法) - 运行
nginx -t,若通过,说明原server_name确实含非法内容 - 再逐条恢复,配合
nginx -t测试,直到复现错误











