在 nginx 中测试 server_name 是否生效,最直接的方法是使用 curl 命令并指定 -h 参数来模拟不同的 host 请求头。通过向服务器发送带有特定域名的请求,观察返回的页面内容或状态码,即可验证 nginx 是否正确匹配了配置的虚拟主机。如果配置了默认服务器块,未匹配的域名会回退到该默认块;如果配置了多个具体域名,则应返回对应域名的内容。

如何验证 server_name 匹配的具体行为
要验证 server_name 的具体匹配行为,需要构造包含不同 Host 头的 HTTP 请求。Nginx 根据请求中的 Host 头与 server_name 指令进行匹配。如果请求的 Host 头与某个 server 块的 server_name 完全匹配,则进入该块处理;如果没有完全匹配,则进入第一个列出的 server_name 对应的块(即默认服务器);如果所有 server 块都没有设置 server_name,则进入没有 server_name 指令的那个块(如果有),否则进入监听端口 80 的第一个 server 块。

server {
listen 80;
server_name example.com www.example.com;
location / {
return 200 "Matched example.com";
add_header Content-Type text/plain;
}
}
server {
listen 80;
server_name test.com;
location / {
return 200 "Matched test.com";
add_header Content-Type text/plain;
}
}
server {
listen 80 default_server;
location / {
return 404 "No match";
add_header Content-Type text/plain;
}
}
使用上述配置,可以通过以下命令验证:
# 匹配 example.com curl -H "Host: example.com" http://localhost/ # 输出: Matched example.com # 匹配 test.com curl -H "Host: test.com" http://localhost/ # 输出: Matched test.com # 未匹配,进入 default_server curl -H "Host: unknown.com" http://localhost/ # 输出: No match
如何验证 server_name 的通配符和精确匹配优先级
Nginx 的 server_name 支持通配符(如 *.example.com)和正则表达式(如 ~^www\.(.*)$)。通配符和精确名称的匹配优先级高于正则表达式。当多个规则可能匹配时,Nginx 会选择最具体的那个。例如,精确匹配 www.example.com 优先于通配符 *.example.com,而通配符又优先于正则表达式。

server {
listen 80;
server_name *.example.com;
location / {
return 200 "Wildcard match";
add_header Content-Type text/plain;
}
}
server {
listen 80;
server_name www.example.com;
location / {
return 200 "Exact match";
add_header Content-Type text/plain;
}
}
server {
listen 80;
server_name ~^blog\.(.*)$;
location / {
return 200 "Regex match";
add_header Content-Type text/plain;
}
}
使用上述配置,可以通过以下命令验证优先级:
# 精确匹配优先 curl -H "Host: www.example.com" http://localhost/ # 输出: Exact match # 通配符匹配 curl -H "Host: api.example.com" http://localhost/ # 输出: Wildcard match # 正则表达式匹配 curl -H "Host: blog.example.com" http://localhost/ # 输出: Regex match
基于 server_name 配置中 default_server 参数的具体影响
在 server_name 配置中,default_server 参数用于指定哪个 server 块作为默认服务器。当请求的 Host 头不匹配任何 server_name 时,Nginx 会将请求路由到标记为 default_server 的块。如果没有明确指定 default_server,则使用监听端口的第一个 server 块作为默认服务器。这有助于处理未定义域名的请求,避免返回错误或默认内容。











