如何强制HTTPS与www,同时匹配RewriteRule实现旧域名及子目录重定向?
搞定Apache重定向规则冲突的问题
嘿,我太懂你这种规则冲突的头疼了!之前我也踩过类似的坑——当你把域名和协议标准化的规则放在前面,又加了[L]标志,后续的子目录重定向规则根本没机会执行,因为Apache一匹配到前面的规则就直接跳转,终止了后续处理。咱们一步步来解决:
先理清楚核心逻辑
咱们要实现三个目标:
- 旧域名跳转到新域名
- 强制所有请求用
https://www.newdomain.com格式 - 旧子目录(比如
/old-subdir/)跳转到新子目录(/new-subdir/)
关键在于规则顺序:先处理子目录的跳转(直接一步到位到最终的合规URL),再处理域名和协议的标准化,这样就不会出现规则被跳过的情况。
完整的可运行代码示例
先确保你的.htaccess(或者Apache虚拟主机配置)里开启了Rewrite模块,然后按这个顺序写规则:
RewriteEngine On # 第一步:处理旧子目录到新子目录的重定向 # 不管当前是什么域名/协议,直接跳转到最终的HTTPS://www格式的新子目录 RewriteRule ^old-subdir/(.*)$ https://www.newdomain.com/new-subdir/$1 [R=301,L] # 第二步:标准化域名和协议——强制所有请求使用HTTPS和www前缀 # 先判断当前请求是否不符合目标格式,避免循环重定向 RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} !^www\.newdomain\.com$ RewriteRule ^(.*)$ https://www.newdomain.com/$1 [R=301,L]
如果有多个旧子目录需要处理,直接在第一步后面加对应的规则就行:
# 比如再加一个旧子目录的跳转 RewriteRule ^old-blog/(.*)$ https://www.newdomain.com/new-blog/$1 [R=301,L]
为什么原来的代码失效了?
大概率是你把域名标准化的规则放在了前面,而且加了[L](Last)标志。这个标志的作用是:一旦当前规则匹配执行,Apache就会停止处理后续所有规则。所以当用户访问旧域名或者非HTTPS的地址时,直接被跳转到https://www.newdomain.com,后续的子目录重定向规则根本没机会被触发。
测试小技巧
你可以用浏览器的开发者工具(F12)看网络请求,验证这几种场景:
- 访问
http://olddomain.com/old-subdir/page.html→ 直接跳转到https://www.newdomain.com/new-subdir/page.html - 访问
https://olddomain.com/about.html→ 跳转到https://www.newdomain.com/about.html - 访问
http://www.newdomain.com/old-subdir/post.html→ 跳转到https://www.newdomain.com/new-subdir/post.html - 访问
https://newdomain.com/contact.html→ 跳转到https://www.newdomain.com/contact.html
记得用301永久重定向,对SEO更友好哦!
内容的提问来源于stack exchange,提问作者Bradley
相关产品推荐
相关产品推荐

