nginx配置禁止IP直接访问

问题

最近搭了个博客小网站,技术栈采用的是nginx+hexo的路线,遇一个问题:
网站,通过域名可以访问,但通过IP也可以访问,如何禁掉IP访问呢?
nginx配置禁止IP直接访问
多方搜索和尝试,大致有这么几个方案:

方案一

在每个域名配置的server块中,添加域名访问判断,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
# 监听 80 端口
listen 80;
autoindex on;
server_name blog.kisstools.com;
return 301 https://$http_host$request_uri;
access_log /home/worker/logs/blog/blog.log;

# 禁止IP访问
if ($host ~* ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$) {
return 403;
}
}

试了一下,OK了,http://IPhttps://IP 这两种访问方式,都被拦截了。
但这种方案有个缺点:每个server块都得添加。
参考这儿:nginx配置禁止IP访问

方案二

在nginx.conf加一个默认返回403的server块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80 default_server;
listen 433 ssl default_server;
server_tokens off;
server_name _;

ssl_certificate /home/worker/ssl/dummy.pem;
ssl_certificate_key /home/worker/ssl/dummy.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

return 403;
}

输入http://IP访问,发现能返回403了;但输入https://IP访问,发现依然能打开网址,浏览器端显示“不安全”字样,也就是没有解决掉SSL访问返回403的问题。
参考这儿:Nginx 禁止 IP 访问并防止泄漏 SSL 证书 | 追殇 Coding

由于我的nginx配置中有4个server,很奇怪,不管怎样,server_name始终会匹配到一个server上,而不是default_server,甚是奇怪,只能在443的server块中,添加IP判断。


nginx配置禁止IP直接访问
https://www.kisstools.com/2024/11/30/experiences/nginx配置禁止IP直接访问/
作者
kisstools
发布于
2024年11月30日
许可协议