我有这个包罗万象:
server {
listen 80 default_server;
server_name _;
return 444;
}
现在,假设我们有两个名为1.2.3.4
和的 IP 1.2.3.5
。
好吧,假设在配置文件中的任何地方1.2.3.4
使用example.com
并且1.2.3.5
从未使用过。基本上只有第一个 IP 在使用中。其他 IP 为空白/空/免费。
好吧,问题来了。上面的服务器块正在使用1.2.3.5
. 因为此 IP 从未与任何服务器块一起使用。这是免费的。分配给服务器。它回应。但从未用于任何网站。listen 80;
指令仅适用于1.2.3.5
.
另一方面,1.2.3.4
是行不通的。Nginx 不监听这个 IP。因为它被另一个服务器块使用。我测试了自己。Indded,Nginx 拒绝监听这个正在被 ngnix 服务器块使用的 Ips
现在,如果我更改listen 80;
为listen 1.2.3.4:80
然后它正在为该 IP 工作。
基本上, Nginx不允许我为默认的包罗万象监听使用过的 IP 地址。
我只想捕获进入我的服务器的每一个不属于我的假域。我想通过假主机禁用用户。但是我真的需要编写每个 IP 来监听吗?
有什么解决方法吗?有什么帮助吗?
编辑 1:我也试过listen *:80;
有通配符。也没有用。
编辑 2:如果我从 listen 指令中删除所有 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,并且该服务器块仅在该级别可用。为此,您必须指定每个 IP。所以,我们有两个选择。
- 使用
listen 80;
指令和参数,您可以为端口定义一个默认服务器80
- 使用
listen ip:80
和定义每个地址自己的默认服务器。
另一个伟大的标语:
在此配置中,nginx 首先根据服务器块的侦听指令测试请求的 IP 地址和端口。然后,它根据与 IP 地址和端口匹配的服务器块的 server_name 条目测试请求的“主机”标头字段。如果找不到服务器名称,则请求将由默认服务器处理。例如,在 192.168.1.1:80 端口上收到的对 www.example.com 的请求将由 192.168.1.1:80 端口的默认服务器处理,即由第一个服务器处理,因为没有 www.example为此端口定义的 .com。
通常,应用程序会将自己分配给系统上“最高”的可用 IP 地址。这种行为在 IPv6 IP 中更常见,但概念是相同的。如果您在服务器块中指定两者,它应该可以正常工作。