以前我以为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;
}