.htaccess重定向去除URL末尾--nocolor-字符串配置问题
错误原因
你的规则反向引用$1为空,核心问题有3个:
- Apache mod_rewrite的正则解析中,
(?=--nocolor-)属于正向先行断言,是非捕获匹配,本身不会生成可被反向引用的捕获内容;你写的第三条规则^.*(?=--nocolor-)甚至没有设置捕获圆括号,自然无法拿到$1的值。 - 现有规则没有加末尾锚定符
$,如果URL路径中间出现--nocolor-字符串会触发误匹配,不符合你"匹配URL末尾该字符串"的需求。 - 你单独配置的
RewriteCond %{REQUEST_URI} (--nocolor-)属于冗余配置,直接在RewriteRule中完成匹配即可,额外的判断条件会增加解析开销。
正确配置方案
在.htaccess中写入如下规则即可,不需要额外配置RewriteCond:
RewriteEngine On RewriteRule ^(.+)--nocolor-$ /$1 [R=301,L]
规则说明
- 正则
^(.+)--nocolor-$会精准匹配所有以--nocolor-结尾的URL路径,自动把后缀前的全部路径内容捕获到反向引用$1中,重定向后正好是移除后缀的目标地址。 - 以你给出的示例路径
/products/test--nocolor-为例,匹配后$1值为products/test,最终会跳转到https://www.test.com/products/test,完全符合需求。 - 不建议在mod_rewrite规则中使用正向/反向预查语法,一方面部分低版本Apache环境存在兼容问题,另一方面直接写全匹配逻辑的可读性、稳定性都更高。
- 配置完成后请先清空浏览器缓存再测试,301永久重定向会被浏览器本地强缓存,旧规则的缓存会干扰测试结果。
- 如果你需要不区分大小写匹配
--nocolor-后缀,可以在标记位增加NC参数,写成[R=301,L,NC]即可。
内容的提问来源于stack exchange,提问作者Giacomo Scarpino
相关产品推荐
相关产品推荐

