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

Bor*_*rsn 5 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_certificate "/etc/nginx/ssl/ca_full.crt";
    ssl_certificate_key "/etc/nginx/ssl/private.key";
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想要实现的是阻止通过 IP 的访问。并且只允许通过域。

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

有什么建议如何解决这个问题吗?

Ric*_*ith 9

您需要定义一个捕获所有服务器。使用指令default_server上的参数listen

例如:

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;
}
Run Code Online (Sandbox Code Playgroud)

服务器需要证书来阻止https连接,任何证书都可以。客户端的浏览器会发出警告,但他们不应该在没有正确域名的情况下尝试连接到安全服务器。

server_name指令不是必需的。非标准代码 444 关闭连接而不发送响应头。

有关详细信息,请参阅此文档

  • 444状态是粗鲁的,它只是挂断连接。据我所知,唯一的选择是发送有效的响应,例如 403、404 或 301。 (3认同)