nginx只是简单地拒绝已经定义的catch-all指令的IP地址

我有这个全面的:

server { listen 80 default_server; server_name _; return 444; } 

现在,假设我们有两个称为1.2.3.41.2.3.5 IP。

那么我们假设1.2.3.4example.com1.2.3.5在configuration文件的任何地方都不会使用。 基本上只有第一个IP被使用。 其他IP为空白/空白/空闲。

好的,这是问题所在。 上面的服务器块正在使用1.2.3.5 。 因为这个IP永远不会用于任何服务器块。 这是免费的。 分配给服务器。 它回应。 但从未用于任何网站。 listen 80; 指令只适用于1.2.3.5

另一方面, 1.2.3.4不起作用。 Nginx不听这个IP。 因为它被一个服务器块使用。 我testing了自己。 不过,Nginx拒绝听这个由ngnix服务器块使用的Ips

现在,如果我改变listen 80; listen 1.2.3.4:80然后我为这个IP工作。

基本上 Nginx不允许我监听使用的IP地址作为默认的catch-all。

我只是想抓住每一个来自我的服务器的不属于我的虚假域名。 我想通过假主机禁用用户。 但是我真的需要写每个IP来听吗?

有没有解决办法? 任何帮助?

编辑1 :我也试过listen *:80; 其中有通配符。 没有工作。

编辑2 :如果我从听指令中删除所有的IP,只留下端口,它的工作原理。 但是,我们是不是把ip地址放在listen指令上? Nginx的例子总是只显示监听端口。 我怀疑哪一个是正确的。 ip:端口或仅端口。

演示

作品

除example.com以外,被拒绝444错误。

 server { listen 1.2.3.4:80 default_server; server_name _; return 444; } server { listen 1.2.3.4:80; server_name example.com; root /www } 

不工作

仍然接受example.com以外的虚假主机

 server { listen 80 default_server; server_name _; return 444; } server { listen 1.2.3.4:80; server_name example.com; root /www } 

结论

在Nathan的评论之后,我发现了这个问题,并发现这一行:

如果存在default_server参数,将使服务器成为指定地址:端口对的默认服务器。

基本上,正如Nathan所说,它会看起来最高的IP,并且该服务器块只在该级别可用。 要做到这一点,你必须sepcify每个IP。 所以,我们有2个选项。

  1. 使用listen 80; 指令和参数,您可以为端口80定义一个默认服务器
  2. 使用listen ip:80并定义每个地址默认服务器。

另一个伟大的标语:

在这个configuration中,nginx首先根据服务器块的listen指令testing请求的IP地址和端口。 然后testing请求的“主机”标头字段与匹配IP地址和端口的服务器块的server_name条目。 如果找不到服务器名称,请求将由默认服务器处理。 例如,在192.168.1.1:80端口收到的www.example.com的请求将由192.168.1.1:80端口的默认服务器处理,即由第一个服务器处理,因为没有www.example .com为此端口定义。

通常,应用程序将自己分配给系统上“最高”的可用IP地址。 这种行为更常见于IPv6 IP,但概念是相同的。 如果您在服务器块中指定它应该工作正常。