Ubuntu 16.04虚拟机下带VirtualDocumentRoot的SSL虚拟主机配置问题
解决动态虚拟主机下的HTTPS配置问题(适配*.dev通配符场景)
我来帮你搞定这个适配动态虚拟主机的HTTPS配置问题,完美匹配你现在用的VirtualDocumentRoot和*.dev域名的开发场景!
1. 生成通配符自签名SSL证书
这是最高效的方案,一次生成就能覆盖所有.dev域名,不用逐个项目折腾。执行以下命令:
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/dev-wildcard.key -out /etc/ssl/certs/dev-wildcard.crt
- 注意在
Common Name字段填写*.dev,这是通配符生效的关键 - 生成的文件路径:
- 私钥:
/etc/ssl/private/dev-wildcard.key - 证书:
/etc/ssl/certs/dev-wildcard.crt
- 私钥:
2. 配置Apache HTTPS动态虚拟主机
Ubuntu 16.04的Apache自带SSL站点模板,咱们复制一份修改成适配动态文档根的配置:
sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/000-default-ssl.conf
编辑这个新文件,替换成以下内容:
<VirtualHost *:443> # 和HTTP虚拟主机完全一致的动态文档根规则 VirtualDocumentRoot /home/steve/websites/%-2/%-2/public_html ServerAlias *.dev # 启用SSL并绑定通配符证书 SSLEngine on SSLCertificateFile /etc/ssl/certs/dev-wildcard.crt SSLCertificateKeyFile /etc/ssl/private/dev-wildcard.key # 开发环境简化版SSL安全配置(可选) SSLCipherSuite HIGH:!aNULL:!MD5 SSLProtocol all -SSLv2 -SSLv3 </VirtualHost>
3. 启用模块并重启Apache
执行以下命令让配置生效:
sudo a2enmod ssl sudo a2ensite 000-default-ssl.conf sudo systemctl restart apache2
4. 处理项目强制HTTPS的调试问题
现在HTTPS站点已经能跑了,但部分项目的源码或.htaccess强制跳转HTTPS会影响调试,给你两个实用方案:
方案A:Apache层面跳过强制跳转(不修改项目代码)
在你的HTTP虚拟主机配置000-default.conf中添加环境变量和规则:
<VirtualHost *:80> VirtualDocumentRoot /home/steve/websites/%-2/%-2/public_html ServerAlias *.dev # 标记开发环境 SetEnv DEV_ENV true RewriteEngine On # 针对开发环境反向处理强制跳转规则 RewriteCond %{ENV:DEV_ENV} true RewriteRule ^(.*)$ http://%{HTTP_HOST}$1 [L] </VirtualHost>
然后在项目的.htaccess或源码中,判断DEV_ENV变量,开发环境就不执行强制HTTPS逻辑。
方案B:修改项目的强制跳转规则(更直接)
在项目的.htaccess中添加域名判断,只在非开发环境跳转:
RewriteEngine On # 仅在非.dev域名下强制HTTPS RewriteCond %{HTTP_HOST} !\.dev$ RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,R=301]
如果是PHP项目,也可以在源码里做判断:
// 开发环境跳过强制HTTPS if (strpos($_SERVER['HTTP_HOST'], '.dev') === false && (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on')) { header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); exit; }
5. 验证配置
现在你只需要:
- 确保hosts文件里的
.dev域名都指向127.0.0.1 - 浏览器访问
https://somesite.dev,虽然会提示证书不安全(自签名证书的正常现象),选择“继续访问”即可看到站点 - 新增项目时,依然按原来的流程创建目录和hosts条目,HTTPS会自动适配
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

