Apache2下HTTPS非www转www重定向失效及证书问题解决
解决HTTPS非www到www的重定向及证书错误问题
问题根源分析
你遇到的证书错误本质是:当前SSL证书仅覆盖www.example.com,未包含根域名example.com。当直接访问https://example.com/xxx时,浏览器会在Apache执行重定向规则前完成SSL握手,此时证书与域名不匹配,直接触发NET::ERR_CERT_COMMON_NAME_INVALID错误。
而带斜杠的请求能正常跳转,是因为Apache对目录路径的自动处理逻辑优先触发了重定向规则;根域名example.com能跳转则是因为默认走HTTP协议,先被重定向到HTTPS的www域名,避开了SSL证书校验环节。
修改.htaccess配置
首先调整规则顺序,确保重定向逻辑优先于Angular路由规则,同时合并重复的RewriteEngine声明:
RewriteEngine On # 1. HTTP请求强制跳转至HTTPS的www域名 RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301] # 2. HTTPS非www域名强制跳转至HTTPS的www域名 RewriteCond %{HTTPS} on RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC] RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301] # 3. 不重写实际存在的文件或目录 RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # 4. Angular HTML5路由重写 RewriteRule ^ index.html [L]
关键补充:修复SSL证书或配置SSL虚拟主机
仅修改.htaccess无法解决直接访问https://example.com的证书错误,需二选一操作:
方案1:更换包含根域名的SSL证书
申请支持SAN(Subject Alternative Name)的证书,同时将example.com和www.example.com加入证书覆盖范围,彻底解决证书匹配问题。
方案2:配置Apache SSL虚拟主机重定向
若暂时无法更换证书,需在Apache的SSL虚拟主机配置中,为example.com单独配置443端口的重定向:
- 打开SSL虚拟主机配置文件(通常路径为
/etc/apache2/sites-available/example.com-le-ssl.conf,若使用Let's Encrypt) - 添加以下配置:
<VirtualHost *:443> ServerName example.com # 填写当前证书路径(即使证书仅包含www域名,仍需配置以完成SSL握手) SSLCertificateFile /path/to/your/certificate.pem SSLCertificateKeyFile /path/to/your/private-key.pem SSLCertificateChainFile /path/to/your/chain.pem # 永久重定向至www域名 Redirect permanent / https://www.example.com/ </VirtualHost> <VirtualHost *:443> ServerName www.example.com DocumentRoot /var/www/your-site-directory AllowOverride All # 正常配置证书路径 SSLCertificateFile /path/to/your/certificate.pem SSLCertificateKeyFile /path/to/your/private-key.pem SSLCertificateChainFile /path/to/your/chain.pem # 其他站点配置(如日志、Header等) </VirtualHost>
- 重启Apache服务生效:
sudo systemctl restart apache2
内容的提问来源于stack exchange,提问作者user21938164
相关产品推荐
相关产品推荐

