主机迷主机迷

nginx如何禁止未绑定域名和IP访问

以前我以为nginx的域名访问是白名单机制,只有在server中配置了的域名才可以访问对应的server,这是我的直觉,可惜nginx不是这样的,具体参考这篇文章:nginx中server的匹配顺序。个人认为,nginx在域名匹配这里的规则是违法直觉的,但没办法,既然采用了nginx,只能按它的规则来。
言归正题,有时候要禁止未绑定域名和IP访问网站,只允许指定的域名网站。这样一是防止其他人把他的域名解析到我的VPS的IP,二是防止其他人通过ip直接看到网站内容(有时候nginx配了多个网站,有的不想对外公开,所以要防止别人通过ip访问看到)。

在nginx添加一个默认的server:

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

以上配置对http访问管用,但限制不了https,https请求访问的443端口,所以还需要配置一个监听443端口的默认server。注意ssl_certificate和ssl_certificate_key这两行配置必须要有,否则Nginx会拒绝所有443的连接。

server {
     listen 443 ssl;
     server_name _;
     ssl_certificate         #随便设置一个ssl证书;                
     ssl_certificate_key     #随便设置一个ssl证书的key;
     return 403;
}

注意以下的配置是错误的,会导致访问正常开启https的域名都出现"连接已重置ERR_CONNECTION_RESET"的错误。

server {
     listen 443;
     server_name _;
     return 403;
}

当然也可以用逻辑判断直接屏蔽掉未绑定的域名,这样更加简单有效。

listen  80;
listen  443 ssl;
server_name  www.example.com;
if ($host != 'www.example.com'){
   return 403;
}
转载请注明出处 | 当前页面:主机迷 » nginx如何禁止未绑定域名和IP访问

评论

  • 请输入 17 + 2 = ? 的计算结果: