Apache2 Ubuntu16.04虚拟主机HTTPS访问非SSL域名问题
首先得搞清楚你遇到的问题根源:
当你尝试访问https://domain2.com/page1/时,Apache找不到对应domain2.com的443端口虚拟主机配置,所以它会自动使用第一个加载的443虚拟主机(也就是你的domain1.com的配置),这就是为什么跳过证书警告后会打开不属于domain2.com的页面。同时,因为domain2.com没有配置SSL证书,浏览器必然会弹出“连接不安全”的错误。
另外注意一下你的domain2.com.conf里有个明显的小失误:<Directory>块指向了/var/www/domain1.com/public_html,这是复制粘贴时的错误,应该改成/var/www/domain2.com/public_html,不然你的domain2.com的HTTP访问可能也会出问题,先把这个修正了。
接下来给你两种解决方案,按需选择:
方案一:给domain2.com配置专属的443虚拟主机(推荐)
直接在domain2.com.conf里添加一个443端口的虚拟主机配置,让所有针对domain2.com的HTTPS请求都返回404错误:
<VirtualHost *:443> ServerName domain2.com ServerAlias www.domain2.com # 启用SSL(即使是自签证书,也能让Apache匹配到这个虚拟主机) SSLEngine on # 生成自签证书的命令(执行一次即可): # sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/domain2.key -out /etc/apache2/ssl/domain2.crt SSLCertificateFile "/etc/apache2/ssl/domain2.crt" SSLCertificateKeyFile "/etc/apache2/ssl/domain2.key" # 所有请求直接返回404 Redirect 404 / # 如果你想直接拒绝连接,也可以换成: # Require all denied </VirtualHost>
修改完成后,重启Apache生效:
sudo systemctl restart apache2
这样之后,访问https://domain2.com时,浏览器还是会弹出证书警告(因为是自签证书),但跳过警告后会看到404页面,不会再跳转到domain1的内容了。
方案二:配置默认443虚拟主机(适合多个非SSL站点的场景)
如果你有多个不需要HTTPS的站点,不想逐个配置443虚拟主机,可以创建一个优先级最高的默认443虚拟主机,处理所有未匹配的HTTPS请求:
- 创建配置文件
/etc/apache2/sites-available/000-default-ssl.conf,内容如下:
<VirtualHost _default_:443> SSLEngine on # 生成默认自签证书: # sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/default.key -out /etc/apache2/ssl/default.crt SSLCertificateFile "/etc/apache2/ssl/default.crt" SSLCertificateKeyFile "/etc/apache2/ssl/default.key" # 所有请求返回404 Redirect 404 / </VirtualHost>
- 启用这个配置:
sudo a2ensite 000-default-ssl.conf
- 重启Apache:
sudo systemctl restart apache2
由于这个配置文件以000-开头,Apache会优先加载它,所有找不到对应443虚拟主机的请求都会落到这里,返回404错误,避免跳转到其他站点的内容。
内容的提问来源于stack exchange,提问作者sandysandeep441

