Nginx允许通过域但不允许通过IP

Nginx允许通过域但不允许通过IP,nginx,Nginx,这是我的配置: server { listen 80; listen [::]:80; server_name domain.tld www.domain.tld; return 301 https://erp.uni.mk$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name domain.tld; ssl_ce

这是我的配置:

server {
    listen 80;
    listen [::]:80;
    server_name  domain.tld www.domain.tld;
    return 301 https://erp.uni.mk$request_uri;
}
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name  domain.tld;
    ssl_certificate "/etc/nginx/ssl/ca_full.crt";
    ssl_certificate_key "/etc/nginx/ssl/private.key";
    ...
}
我试图实现的是通过IP阻止访问。并且只允许通过域进行访问

我见过一些使用regex的解决方案,但我同时使用IPv4和IPv6。而且它不应该影响性能


有什么建议可以解决这个问题吗?

您需要定义一个全面覆盖的服务器。使用
listen
指令上的
default\u server
参数

例如:

server {
    listen 80 default_server;
    listen 443 ssl default_server;

    ssl_certificate /path/to/any/cert.pem;
    ssl_certificate_key /path/to/any/key.pem;

    return 444;
}
服务器需要一个证书来阻止
https
连接,任何证书都可以。客户端的浏览器将抛出警告,但他们无论如何都不应该试图连接到没有正确域名的安全服务器

不需要
server\u name
指令。非标准代码444在不发送响应头的情况下关闭连接


有关详细信息,请参阅。

您可以添加一个只侦听IP的
服务器
块,然后重定向这些请求,这样您就不需要了;不必编辑现有的块<代码>服务器{listen 80;服务器名称1.1.1.1;返回301http://something}@0stone0我知道,但我一直在寻找一种不用麻烦更改IP地址的方法。因为我将对多个服务器使用相同的配置。如果您首先创建一个将lissen转换为域名的块,然后创建一个(默认)侦听“其余”的块(空服务器名称或“默认”选项),您不需要列出IPUse
nginx-t
(大写
t
)测试配置并确保看到新的
服务器
块。重新启动Nginx服务器后清除浏览器缓存。我通过HTTP/2:
curl:(92)HTTP/2 stream 1未完全关闭:内部错误(err 2)
是否有其他方法关闭连接而不返回任何内容?444状态不正确,只是挂断了连接。AFAIK唯一的选择是发送有效响应,例如403、404或301。