Apache RewriteCond如何匹配两个反向引用?规则配置求助
Apache RewriteCond 正确配置方案
问题分析
你的需求是:仅当旧URI的两个捕获组内容一致时(如/release-foo/foo/xxx),内部转发到新路径/release/foo/xxx;若两个捕获组不一致(如/release-foo/bar/xxx),则外部重定向到正确的旧URI(/release-foo/foo/xxx),同时避免循环。
之前的错误在于:在RewriteCond中误用$1/$2引用RewriteRule的捕获组——RewriteCond执行顺序早于RewriteRule,无法直接获取后者的捕获组,需通过RewriteCond自身匹配URI并捕获分组,用%1/%2引用。
正确配置
方案一(分规则处理,清晰直观)
# 处理捕获组不一致的情况:重定向到正确的旧URI RewriteCond %{REQUEST_URI} ^/release-(\w+)/(\w+)/(.*)$ RewriteCond %1 != %2 RewriteRule ^ /release-%1/%1/%3 [R=301,L] # 处理捕获组一致的情况:内部转发到新路径 RewriteRule ^/release-(\w+)/(\w+)/(.*)$ /release/$1/$3 [L]
方案二(单规则+多条件,更紧凑)
# 仅当两个捕获组一致时,内部转发到新路径 RewriteCond %{REQUEST_URI} ^/release-(\w+)/(\w+)/(.*)$ RewriteCond %1 = %2 RewriteRule ^ /release/%1/%3 [L] # 捕获组不一致时,重定向到正确的旧URI RewriteCond %{REQUEST_URI} ^/release-(\w+)/(\w+)/(.*)$ RewriteCond %1 != %2 RewriteRule ^ /release-%1/%1/%3 [R=301,L]
关键说明
- 捕获组引用:
RewriteCond中用%1/%2/%3引用自身匹配的捕获组,区别于RewriteRule中的$1/$2/$3。 - 重定向避免循环:重定向后的目标URI(如
/release-foo/foo/xxx)会被第二个规则匹配,此时两个捕获组一致,不会再次触发重定向条件。 - 重定向类型:测试阶段建议用
R=302(临时重定向),确认无误后改为R=301(永久重定向),避免浏览器缓存错误规则。 - 路径适配:若配置在
.htaccess文件中,RewriteRule的开头需去掉/(改为相对路径),例如:RewriteRule ^release-(\w+)/(\w+)/(.*)$ release/$1/$3 [L]
内容的提问来源于stack exchange,提问作者Khosrow
相关产品推荐
相关产品推荐

