在 nginx 中,`server_name` 配置项默认不支持使用下划线 `_` 作为通配符来匹配所有请求。要实现匹配所有请求(即作为默认服务器),应使用空字符串 `""` 或省略该指令。当客户端请求的 `host` 头不匹配任何已配置的 `server_name` 时,nginx 会将请求路由到该虚拟主机。

为什么下划线不能匹配所有请求
下划线 `_` 在 DNS 和 HTTP Host 头中是一个合法的字符,但它没有特殊的“通配”含义。如果配置 `server_name _;`,Nginx 只会精确匹配 `Host: _` 的请求,而不会匹配 `example.com` 或其他域名。因此,它无法实现“匹配所有请求”的目的。

如何正确配置默认服务器以捕获未匹配请求
要捕获所有未明确匹配的请求,应将 `server_name` 设置为空字符串 `""`。这是 Nginx 官方推荐的做法,确保当 `Host` 头为空或与任何已知域名不匹配时,请求都能被正确处理。
server {
listen 80 default_server;
server_name "";
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
上述配置中,`default_server` 参数确保该块是默认的虚拟主机。`server_name "";` 使其成为捕获所有未匹配 Host 头的最终兜底。测试时,可以使用 `curl -H "Host: unknown.com" http://your-ip` 验证是否返回预期内容。
基于实际输入条件的具体问题分析
当客户端发送一个不包含有效 `Host` 头(如 `Host:` 为空)或 `Host` 值为随机字符串时,Nginx 的行为完全取决于 `server_name` 的配置。若未设置 `default_server` 且无空 `server_name`,Nginx 可能返回 404 或第一个虚拟主机的内容,这可能导致安全或逻辑问题。因此,显式配置 `server_name ""` 并配合 `default_server` 是确保行为一致性的关键步骤。


















