如何在.htaccess中正确配置重定向,强制HTTPS与www并避免循环?
一步解决HTTPS + www重定向循环问题
当然可以一步到位实现跳转,重定向循环完全是可以避免的——大多是因为之前的规则逻辑顺序或者条件判断没写对才导致的两次跳转甚至循环。
下面是经过验证的.htaccess配置,能直接把所有非HTTPS、非www的请求一次性跳转到https://www.example.com,彻底消除循环:
RewriteEngine On # 强制跳转至HTTPS + www,一步完成 RewriteCond %{HTTP_HOST} !^www\. [NC,OR] RewriteCond %{HTTPS} off RewriteRule ^ https://www.example.com%{REQUEST_URI} [L,R=301,NE]
规则细节解释:
RewriteEngine On:必须开启重写引擎,这是所有重写规则的运行前提- 第一个
RewriteCond:检查请求的域名不是以www.开头(!^www\.),NC参数表示不区分大小写(比如Example.com这类大小写混合的域名也会被匹配),OR表示只要满足两个条件中的任意一个,就触发后续的重定向规则 - 第二个
RewriteCond:检查当前请求使用的是HTTP(非HTTPS)协议 RewriteRule:把请求重定向到https://www.example.com加上原请求的完整路径(%{REQUEST_URI}保证跳转后用户访问的具体页面不变),L表示这是最后执行的规则,R=301是永久重定向(搜索引擎会更新索引记录),NE参数避免对URI中的特殊字符(比如?、&)进行二次编码
为什么不会出现循环?
当用户访问https://www.example.com时,两个判断条件都不满足:域名是以www.开头的,且HTTPS是开启状态,所以这条规则不会被触发,自然不会陷入循环。
额外注意事项:
- 把这段规则放在
.htaccess文件的最顶部,避免和其他重写规则冲突 - 测试阶段可以把
R=301改成R=302(临时重定向),避免浏览器缓存错误的重定向规则,确认配置没问题后再改回301 - 确保你的服务器已经正确配置了HTTPS证书,否则可能会出现证书信任错误
内容的提问来源于stack exchange,提问作者Patrick Sharer




