我有这个万能答案:
server {
listen 80 default_server;
server_name _;
return 444;
}
现在,假设我们有两个 IP 分别称为1.2.3.4
和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。因为它被另一个服务器块使用。我自己测试了一下。确实,Nginx 拒绝监听被 ngnix 服务器阻止使用的 IP
现在,如果我更改listen 80;
为,listen 1.2.3.4:80
那么它就为该 IP 工作。
基本上再次Nginx 做不是允许我监听默认捕获所有 IP 地址。
我只想抓住每一个进入我的服务器的虚假域名,这些域名不是属于对我来说。我想通过虚假主机禁用用户。但我真的需要写下每个要监听的 IP 吗?
有什么解决方法吗?有什么帮助吗?
编辑1:我也尝试了listen *:80;
带通配符的。也没有用。
编辑2:如果我从 listen 指令中删除所有 IP 并仅保留端口,它就可以正常工作。但我们不是在 listen 指令上放置了 ip 地址吗?Nginx 示例始终在 listen 上仅显示端口。我怀疑哪一个是正确的。ip:port 还是仅端口。
演示:
作品:
除 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。所以,我们有 2 个选项。
- 使用
listen 80;
指令和参数你可以定义一端口的默认服务器80
- 使用
listen ip:80
和定义每个地址自己的默认服务器。
另一个很棒的标语:
在此配置中,nginx 首先根据服务器块的 listen 指令测试请求的 IP 地址和端口。然后,它根据与 IP 地址和端口匹配的服务器块的 server_name 条目测试请求的“Host”标头字段。如果未找到服务器名称,则默认服务器将处理该请求。例如,在 192.168.1.1:80 端口上接收的对 www.example.com 的请求将由 192.168.1.1:80 端口的默认服务器(即第一台服务器)处理,因为此端口没有定义 www.example.com。
答案1
通常,应用程序会将自己分配给系统上“最高”的可用 IP 地址。这种行为在 IPv6 IP 中更常见,但概念是相同的。如果您在服务器块中同时指定两者,它应该可以正常工作。