我有一个启用了多个服务器块的 Nginx。每个服务器响应 1 个规范域,并可能将 1 个或多个转发到该规范 URL。我至少有一台服务器(尚未检查所有服务器),如果我输入指向此框的不存在的域,Nginx 会显示它选择的站点(始终是同一个站点,但不是我想要的站点)。
我查看了我经常访问的网站的配置文件,但没有发现任何东西明显的这会将其标识为任何类型的默认站点,但它就在那里,当我错误地输入 URL 时总是会显示出来。
有什么想法我应该寻找什么来追踪这一点?
答案1
在您想要作为默认设置的指令中添加default_server
该listen
指令。server
答案2
nginx 为什么这样做?
原因很简单。非常老旧或损坏的客户端不会Host
在其请求中发送 HTTP 标头字段,如果您使用基于名称的服务器块(Apache 术语中称为基于名称的虚拟主机),nginx 无法确定您配置的哪个服务器是客户端所指的。对于支持此基于名称的系统的任何其他 Web 服务器,也存在同样的问题。如果您对每个域使用基于 IP 的系统(这也意味着您有多个网络接口),则不会出现此问题。
关于此主题还有更多内容吗?nginx 如何处理请求
哪一个是第一个?
如果任何指令default
上未设置标志,则 nginx 将选择首先到达的服务器:listen
server {
server_name server1.com;
}
server {
server_name server2.com;
}
server1.com
将是默认的。
如果您自动包含来自(默认配置)的符号链接,则sites-enabled
目录中第一个出现的文件将成为您的第一个服务器。
我该怎么做才能防止这种情况发生?
好问题,你应该避免这种情况。没有理由支持这些旧客户端,也绝对没有理由支持损坏的客户端。通过创建一个默认的捕获所有服务器配置,可以轻松解决此问题。以下示例来自我的一个项目,针对当前开发版本的 nginx(1.5.2 - 但也应该适用于旧版本):
# /etc/nginx/sites-enabled/_.conf
# Default server for clients who do not send correct Host header.
# The underline in the file name makes sure that this file comes first in the dir.
server {
server_name _;
listen *:80 default_server deferred;
return 444;
}
配置经过精简,更多 nginx 配置内容。