没加证书的域名通过https访问,错误的访问到有证书的域名项目--已解决

今天有同事遇到这样一个问题,问题的经过是这样的:

同一台服务器里,nginx 部署了多个项目,有的加了ssl证书,有的没有加。

其中有一个没加证书的项目,在测试时,以https协议头访问,浏览器提示没有证书不安全,点击继续访问后,既然出现了另一个有证书的项目的页面。

比如: 项目A  aa.com 和项目B bb.com, bb.com 有证书,aa.com 没有证书。正常来说,https://aa.com 是无法访问的,但是在访问 https://aa.com 的时候,响应的页面竟然是 https://bb.com (虽然浏览器仍然会提示 证书不安全)

这个时候,就开始一一排查,应该是 aa.com 项目没有监听443端口,然后这个请求就被其它监听443端口的项目给接管了,并且还是有顺序的接管

比如:在 nginx/vhost/目录下有 多个配置文件,分别是 aa.com.conf 和 bb.com.conf 和 ab.com.conf

aa.com.conf 没有证书,而其它两个有证书,但是接管顺序也是按照 配置文件的加载顺序来进行,按照正常的文件名排序,就是 ab.com.conf 优先于 bb.com.conf

(以上只是个人理解,有明白的朋友希望可以在评论中补充并指错)

最后的解决办法就是,写一个默认的配置文件,去接管一些没有部署证书的项目,代码如下 :

server
{
    listen 80; # 监听80端口
    listen 443 ssl http2; # 同时也监听443端口
    server_name _; # 默认监听所有没有被接管的项目
    index index.html;
    root /www/nginx/html; # 给一个默认页面

    # 当监听443端口时,以下两行的证书路径必须写上
    ssl_certificate    /www/data/cert/fullchain.pem;
    ssl_certificate_key    /www/data/cert/privkey.pem;
    
    location ~ / {
        # 判断所有访问443端口的项目,让它再重新跳转至 80端口
    if ($server_port ~ 443) {    
            return 301 http://$host$request_uri;
        }
    }
}
Talk is cheap, show me the code.
原文地址:https://www.cnblogs.com/cidgur/p/14944765.html