Nginx 设置只允许域名访问网站,禁止使用IP 访问80,443端口
本文最后更新于 -1 天前,其中的信息可能已经有所发展或是发生改变。

一、背景

为了避免其他人把未备案的域名解析到自己的服务器IP,而导致服务器被断网,我们可以通过禁止使用ip访问的方法,防止此类事情的发生。网上很多都是添加一个空白的默认站点进行设置,这个方法我试了下,结果没成功,不知道是什么原因。

二、解决办法

如果网站只配置了 80 端口,那么按以下nginx配置:

新添加一个 server:

server {
  listen 80 default;
  server_name 115.*.*.*;
  return 403;
}

注:直接在服务器的Nginx的配置中添加,不是修改网站配置文件

重载nginx配置文件,然后用IP访问,显示如下:

如果还配置了 443 端口,还需要加点配置:

server {
  listen 80 default;
  listen 443 default_server;
  server_name 115.*.*.*;
  return 403;

  ssl_certificate       /usr/local/nginx/cert/hello.pem;
  ssl_certificate_key     /usr/local/nginx/cert/hello.key;
  ssl_session_cache      shared:SSL:10m;
  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;
}

为什么要加上ssl证书的配置?

Nginx 上对于使用 SSL协议的虚拟主机,如果不配置SSL证书的时候访问会出现协议错误,哪怕端口上配置了其它网站也会报错。解决方法就是随便生成一个证书配置进去。

就是说 443端口如果也跟 80端口那样子的配置,使用https方式访问正常的域名也会被拒绝连接。

注:SSL证书配置请根据自己实际情况,每人的证书配置不同。

重载nginx配置文件,然后用IP访问,显示如下:

使用IP访问80、443返回 403 Forbidden,使用域名访问正常。

还有一种解决方法,就是在server里加上一段正则匹配(此方法没试验过,不知道是否能用):

listen  80;
server_name  www.xxxxxxxx.com;
if ($host != 'www.xxxxxxxx.com'){
   return 403;
}
上一篇
下一篇