演示:

演示:

我有这个万能答案:

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

现在,假设我们有两个 IP 分别称为1.2.3.41.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 个选项。

  1. 使用listen 80;指令和参数你可以定义端口的默认服务器80
  2. 使用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 中更常见,但概念是相同的。如果您在服务器块中同时指定两者,它应该可以正常工作。

相关内容