之前有个问题一直没有留意,直到最近服务器动不动崩溃才意识到,似乎我一直没有禁止对服务器IP的直接访问。这次趁着更换操作系统并升级MediaWiki的时候就一起进行考虑了。
Nginx提供了多种方法来防止通过IP地址直接访问网站。

一、修改Nginx配置文件

要实现Nginx禁止通过IP访问,可以通过修改Nginx的配置文件(nginx.conf)来实现,以下是具体的配置步骤:

步骤1: 打开Nginx的配置文件nginx.conf。

步骤2: 在http块中添加一个新的server段,用于处理默认虚拟主机,关键配置在于listen 80 default;这行代码,它表示这个server块将作为默认虚拟主机。

步骤3: 在这个server块中,可以设置返回403(禁止访问)或者是444(关闭连接却不返回信息),或者进行其他自定义操作,如跳转到指定页面。

server {
    listen       80 default;
    server_name  _;
    return       403;
}

在上述配置中,当用户通过IP地址或未设置的域名访问时,将返回403禁止访问的错误。

二、使用正则表达式限制域名访问

除了简单地禁止IP访问外,还可以通过正则表达式来限制只有特定的域名才能访问网站,以下是一个示例配置:

server {
    listen       80;
    server_name  ~^(www.)?yourdomain.com;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    if ($host !~* ^(www.)?yourdomain.com$ ) {
        return 403;
    }
}

在这个配置中,server_name ~^(www.)?yourdomain.com;使用了正则表达式来匹配指定的域名,而if ($host !~* ^(www.)?yourdomain.com$ )则用于检查请求的Host头是否与正则表达式匹配,如果不匹配则返回403错误。

  1. 防盗链设置

为了防止资源被盗用,可以在Nginx中设置防盗链,这通常涉及到检查请求的Referer头部,以确保请求是从合法的页面发起的,以下是一个简单的防盗链配置示例:

server {
    listen 80;
    server_name yourdomain.com;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        valid_referers none blocked *.yourdomain.org www.yourdomain.com;
        if ($invalid_referer) {
            return 403;
        }
    }
}

在这个配置中,valid_referers指令用于指定合法的Referer头部值,如果请求的Referer头部不合法,则返回403错误。

三、注意事项

在进行以上配置时,请确保已经备份了原始的Nginx配置文件,以便在需要时可以恢复。

修改完配置文件后,需要重新加载或重启Nginx服务使配置生效,可以使用以下命令重新加载Nginx配置:

sudo nginx -s reload

如果服务器上有多个站点,并且只想禁止其中一个站点的IP访问,而不影响其他站点,那么需要在对应的server块中进行配置,而不是在全局的http块中。
对于复杂的需求,可能需要结合多种方法来实现完全的访问控制,可以先使用地理位置限制来允许或拒绝特定地区的访问,然后再在server块中进行更细粒度的控制。
通过以上配置,可以有效地防止通过IP地址直接访问Nginx服务器,同时提高服务器的安全性和稳定性。

存在的问题

这两天按网上搜来的如下配置,结果发现无法上传文件到OSS上了。

erver {
    listen 80 default;
    listen 443 default_server;    #使用https/443时启用
    ssl_certificate    xxx.pem;   #使用https/443时启用,输入任意站点的有效SSL证书路径即可
    ssl_certificate_key    xxx.pem;   #使用https/443时启用,输入任意站点的有效SSL证书路径即可
    server_name _;
    return 444;
}

注释掉443和SSL的内容就恢复正常了。

最后修改:2025 年 01 月 07 日
如果觉得我的文章对你有用,请随意赞赏