在 nginx 中,捕获未匹配域名的默认行为是将其路由到监听该端口的第一个 server 块。要实现自定义的默认域名处理,只需将目标 server 块的 server_name 设置为一个点号 .,nginx 会将其识别为通配所有剩余请求的兜底规则。

如何配置自定义的默认服务器块
通过设置 server_name .; 可以明确指定哪个服务块作为默认接收者。当客户端发起的请求中,HTTP Host 头无法匹配任何已配置的 server_name 时,Nginx 就会进入这个特定的 server 块。这通常用于返回 444 错误码以拒绝非法请求,或者重定向到一个统一的欢迎页面。

server {
listen 80 default_server;
server_name .;
# 直接断开连接,不返回任何响应
return 444;
}
上述配置中,default_server 参数显式声明了该块的首选地位,而 server_name .; 则从逻辑上覆盖了所有未命中的域名。如果省略 default_server,Nginx 依然会选择配置文件加载顺序中第一个监听该端口的块作为默认值,但显式声明能避免歧义。
未匹配请求的具体处理结果是什么
当请求命中默认服务器块时,具体的处理结果完全取决于该块内定义的指令。最常见的结果是返回 HTTP 444 状态码(无响应),或者返回 403/404 等标准错误页。如果没有定义任何内容或错误页面,Nginx 可能会返回其内置的默认错误文档。

server {
listen 80;
server_name example.com;
root /var/www/html;
}
server {
listen 80;
server_name .;
root /var/www/default;
error_page 404 /missing.html;
}
在这个对比示例中,访问 example.com 会正常显示网站内容。而如果访问 unknown.com,由于没有匹配的 server_name,请求会被第二个 server 块捕获。此时,如果请求的文件不存在,Nginx 会尝试提供 /var/www/default/missing.html。这种机制确保了即使是不合法的域名请求,也能得到可控的响应,而不是由 Nginx 抛出内部错误或随机路由到其他站点。
基于 server_name 为空时的具体行为
当客户端发送的请求中不包含 Host 头,或者 Host 头为空字符串时,Nginx 的处理逻辑与未匹配域名略有不同。根据 HTTP/1.1 规范,缺少 Host 头在某些情况下被视为非法请求,但在实际应用中,Nginx 会将其视为一种特殊的“未匹配”情况。
server {
listen 80;
server_name "";
return 400 "Bad Request";
}
如果在某个 server 块中将 server_name 显式设置为空字符串 "",该块将专门捕获那些 Host 头缺失或为空的请求。这与使用 . 捕获其他未匹配域名形成互补。开发者可以利用这一点来严格校验请求合法性,强制要求客户端必须提供有效的 Host 头,否则直接返回 400 错误。这种细粒度的控制有助于防止因缺少 Host 头导致的安全风险或路由混乱。











