新增第二条RewriteRule后第一条规则被跳过的.htaccess配置问题
问题核心原因
- 第一条HTTPS跳转规则未添加
[L]终止标记,mod_rewrite会顺序执行完所有规则,第二条带[L]的规则会直接覆盖第一条的跳转目标,导致/BBB后缀丢失 %{REQUEST_URI}变量取的是请求初始的URI,不会被同轮次里前面的重写规则修改,因此即便先执行路径替换,直接用%{REQUEST_URI}拼接也带不上修改后的路径内容- 跳转类规则未显式指定
R标记,容易出现内部重写和外部跳转的逻辑歧义
修复方案
方案1:保留原有逻辑,加终止标记(完全匹配你的预期)
给第一条规则加[L,R=302],通过两次跳转拿到目标结果:
RewriteEngine On RewriteBase / RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI}/BBB [R=302,L] RewriteRule ^REMOVE(/.*)?$ https://%{HTTP_HOST}$1/CCC [R=302,L]
执行流程:
- 第一次请求
http://test-domain.com/REMOVE/AAA,匹配第一条规则跳转到https://test-domain.com/REMOVE/AAA/BBB - 第二次HTTPS请求进来,匹配第二条规则跳转到
https://test-domain.com/AAA/BBB/CCC
方案2:单轮一次跳转(推荐,减少3xx跳转次数)
先完成路径修改,再统一处理HTTPS跳转和后缀拼接,只触发一次跳转:
RewriteEngine On RewriteBase / # 先处理REMOVE前缀移除,按顺序拼接BBB、CCC后缀,内部重写不跳转 RewriteRule ^REMOVE(/.*)?$ $1/BBB/CCC [DPI] # 统一处理HTTPS跳转 RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]
额外注意事项
- 测试阶段建议用
R=302临时重定向,避免浏览器缓存301永久重定向导致规则修改不生效 [DPI]标记用于丢弃原始请求的路径信息,确保重写后的路径后续处理正常- 涉及域名的跳转建议显式加
L标记,避免后续规则覆盖跳转目标
内容的提问来源于stack exchange,提问作者djackdonovan
相关产品推荐
相关产品推荐

