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

时间:2020-05-14 14:41:34

标签: 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";
    ...
}

我要实现的目标是通过IP进行块访问。并且仅允许通过域。

我已经看到了使用正则表达式的一些解决方案,但是我同时使用了IPv4和IPv6。而且不会影响性能。

任何建议如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您需要定义一个捕获所有服务器。在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;
}

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

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

有关详细信息,请参见this document