一、背景
为了避免别人把未备案的域名解析到自己的服务器ip而导致服务器被断网,需要在nginx上设置禁止通过ip访问服务器,只能通过域名访问。
二、解决方法
如果网站只配置了 80 端口,那么按以下nginx配置:
新添加一个 server:
server { listen 80 default; server_name _; return 403;}
重载nginx配置文件,然后用IP访问,显示如下:
果还配置了 443 端口,还需要加点配置:
server { listen 80 default; listen 443 default_server; server_name _; 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方式访问正常的域名也会被拒绝连接。
重载nginx配置文件,然后用IP访问,显示如下:
使用IP访问80、443返回 403 Forbidden,使用域名访问正常。
还有一种解决方法,就是在server里加上一段正则匹配:
listen 80;server_name www.xxxxxxxx.com;if ($host != 'www.xxxxxxxx.com'){ return 403;}