一、背景
為了避免別人把未備案的域名解析到自己的服務器ip而導致服務器被斷網,需要在Nginx上設置禁止通過ip訪問服務器,只能通過域名訪問。
二、解決方法
如果網站只配置了 80 端口,那么按以下nginx配置:
新添加一個 server:
server{listen80default;server_name_;return403;}
重載nginx配置文件,然后用IP訪問,顯示如下:
果還配置了 443 端口,還需要加點配置:
server{listen80default;listen443default_server;server_name_;return403;ssl_certificate/usr/local/nginx/cert/hello.pem;ssl_certificate_key/usr/local/nginx/cert/hello.key;ssl_session_cacheshared:SSL:10m;ssl_session_timeout5m;ssl_ciphersECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;ssl_protocolsTLSv1TLSv1.1TLSv1.2;ssl_prefer_server_cipherson;}
為什么要加上ssl證書的配置?
Nginx 上對于使用 SSL協議的虛擬主機,如果不配置SSL證書的時候訪問會出現協議錯誤,哪怕端口上配置了其它網站也會報錯。解決方法就是隨便生成一個證書配置進去。
就是說 443端口如果也跟 80端口那樣子的配置,使用https方式訪問正常的域名也會被拒絕連接。
重載nginx配置文件,然后用IP訪問,顯示如下:
使用IP訪問80、443返回 403 Forbidden,使用域名訪問正常。
還有一種解決方法,就是在server里加上一段正則匹配:
listen80;server_namewww.xxxxxxxx.com;if($host!='www.xxxxxxxx.com'){return403;}