我有一个Nginx与一些启用服务器块。 每个服务器都回答1个规范域,并可能向该规范URL转发1个或更多。 我有至less一个服务器(还没有检查所有),如果我input一个不存在的域指向这个盒子,Nginx显示一个它select的网站(总是同一个网站,但不是一个我后)。
我已经为我经常登陆的站点的configuration文件捅了一圈,但没有看到任何明显的东西,将其标识为任何types的默认站点,但它仍然存在,当我手指指向一个URL时总是显示出来。
有什么想法,我应该寻找什么追踪这个?
将default_server
添加到要作为默认server
中的listen
指令。
这样做的原因是简单的。 非常旧的或破损的客户端不会在其请求中发送Host
HTTP头字段,并且如果您使用的是基于名称的服务器块(基于名称的虚拟主机,按照Apache的说法),nginx无法确定您configuration的服务器是由客户。 任何其他支持这个基于名字的系统的networking服务器也是如此。 如果您要为每个域使用基于IP的系统(这也意味着您有多个networking接口),则不会出现此问题。
更多关于这个话题? nginx如何处理请求
如果在任何listen
指令中没有default
标志,nginx将select第一个来的服务器:
server { server_name server1.com; } server { server_name server2.com; }
server1.com
将是默认的。
如果自动包含sites-enabled
的符号链接(默认configuration),则该目录中第一个文件将成为您的第一个服务器。
好问题,你应该防止它。 没有理由支持这些老客户,绝对没有理由支持破碎的客户。 这个问题很容易通过创build一个默认的catch all server config来解决。 以下示例来自我的一个项目,面向当前的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; }
configuration被修剪, 更多的nginxconfiguration的东西 。