遇到 invalid server name 错误通常是因为 nginx 配置文件中使用了非法字符、未正确转义或包含特殊符号的域名。修复方法是检查 server_name 指令的值,确保只包含字母、数字、连字符(-)和点号(.),并移除任何空格或特殊符号。

哪些字符会导致 server_name 报错?
Nginx 的 server_name 指令严格限制域名格式。常见的非法输入包括:域名中包含空格、下划线(_)、星号(*)未作为通配符使用、或者包含了非 ASCII 字符。此外,如果域名以连字符开头或结尾,或者包含连续的两个点号(..),也会触发此错误。Nginx 在解析时会将这些视为无效标识符。

server {
listen 80;
# 错误示例:包含空格和下划线
server_name my_site.example.com;
}
server {
listen 80;
# 正确示例:仅使用字母、数字、连字符和点号
server_name my-site.example.com;
}
上述代码中,第一处配置因包含空格和下划线而无效,第二处符合规范。运行 nginx -t 会明确提示哪一行出错。
如何处理通配符和子域名匹配?
当需要匹配多个子域名时,应使用通配符 *. 或前缀通配符 *.example.com。注意,通配符只能出现在域名的最左侧或最右侧,不能出现在中间。例如,*.example.com 是合法的,但 www.*.example.com 是非法的。此外,精确匹配优先于通配符匹配,这在处理复杂路由时至关重要。

server {
listen 80;
# 合法:匹配所有 subdomain.example.com
server_name *.example.com;
}
server {
listen 80;
# 合法:精确匹配 api.example.com
server_name api.example.com;
}
通过这种结构,Nginx 能正确区分不同子域名的请求。若配置了非法的通配符位置,如 sub.*.example.com,则会导致语法检查失败。建议始终使用 nginx -t 验证配置后再重载服务。
为什么某些特殊字符会被拒绝?
除了基本格式问题,某些特殊字符如 @、!、# 等在域名中是绝对禁止的。这些字符在 DNS 协议中无定义,因此 Nginx 直接拒绝解析。如果业务场景确实需要处理此类字符,应考虑使用 URL 路径参数而非域名部分来传递信息。例如,将 user@domain.com 改为 domain.com?email=user@domain.com。这样既符合 Nginx 规范,又能满足功能需求。











