Apache Mod_Rewrite去除www域名重定向失效问题求助
解决Apache移除www并强制HTTPS重定向的问题
问题根源
你当前的配置仅覆盖了**80端口(HTTP)**的请求,当用户直接访问www.yourdomain.com的HTTPS(443端口)地址时:
- Apache没有对应的443端口VirtualHost配置,无法处理该请求的重定向逻辑
- 由于SSL证书仅针对非www域名,浏览器会先弹出证书错误警告,阻断后续重定向流程
- 原80端口规则存在逻辑顺序问题:先将HTTP请求跳转到同域名的HTTPS(包括www),导致用户访问
http://www.yourdomain.com时,会先跳转到https://www.yourdomain.com触发证书错误,而非直接跳转到非www的HTTPS
修复方案
1. 确保启用必要模块
先确认Apache已启用mod_rewrite和mod_ssl模块:
sudo a2enmod rewrite ssl sudo systemctl restart apache2
2. 修改VirtualHost配置
替换原有配置为以下内容(注意替换yourdomain.com为你的实际域名,以及证书文件路径):
处理所有HTTP(80端口)请求
直接将所有HTTP请求(无论是否带www)跳转到HTTPS的非www域名,避免中间跳转触发证书错误:
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined RewriteEngine On # 匹配所有带/不带www的HTTP请求,跳转到非www的HTTPS RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$ [NC] RewriteRule ^ https://%2%{REQUEST_URI} [L,R=permanent] </VirtualHost>
处理HTTPS(443端口)请求
新增两个443端口的VirtualHost:一个专门处理www域名的重定向,另一个处理主域名的正常请求:
# 处理www域名的HTTPS请求,强制跳转到非www <VirtualHost *:443> ServerName www.yourdomain.com ErrorLog ${APACHE_LOG_DIR}/www-error.log CustomLog ${APACHE_LOG_DIR}/www-access.log combined RewriteEngine On RewriteRule ^ https://yourdomain.com%{REQUEST_URI} [L,R=permanent] # 必须配置SSL参数(即使证书不匹配,Apache才能启动) SSLEngine On SSLCertificateFile /path/to/your/certificate.crt SSLCertificateKeyFile /path/to/your/private.key </VirtualHost> # 处理主域名的HTTPS正常请求 <VirtualHost *:443> ServerName yourdomain.com DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine On SSLCertificateFile /path/to/your/certificate.crt SSLCertificateKeyFile /path/to/your/private.key # 其他站点配置(如目录权限等) <Directory /var/www> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>
验证步骤
- 保存配置后重启Apache:
sudo systemctl restart apache2 - 清除浏览器缓存(避免301重定向缓存干扰测试)
- 测试以下地址:
http://yourdomain.com→ 应跳转到https://yourdomain.comhttp://www.yourdomain.com→ 应直接跳转到https://yourdomain.comhttps://www.yourdomain.com→ 浏览器会先提示证书错误,确认后会跳转到https://yourdomain.com
注:如果不想让用户看到证书错误,推荐使用Let's Encrypt免费申请包含
yourdomain.com和www.yourdomain.com的多域名SSL证书,这样重定向过程完全无警告。
内容的提问来源于stack exchange,提问作者Maciek
相关产品推荐
相关产品推荐

