.htaccess规则在含index.php的URL中失效,寻求正确改写方案
适配含index.php的.htaccess重写规则修改方案
原有的.htaccess规则可将URL中的OLDNAME替换为NEWNAME,同时移除URL末尾可能存在的-2字符串:
RewriteRule ^OLDNAME/(.+?)(?:-2)?/?$ /NEWNAME/$1 [L,NC,R=302,NE]
该规则能正常处理以下两类URL:
https://example.com/OLDNAME/item/a-long-file-name-separated-by-hyphens-2https://example.com/OLDNAME/item/a-long-file-name-separated-by-hyphens
但当URL包含index.php前缀时,规则失效,无法处理以下URL:
https://example.com/index.php/OLDNAME/item/a-long-file-name-separated-by-hyphens-2https://example.com/index.php/OLDNAME/item/a-long-file-name-separated-by-hyphens
我曾尝试修改规则适配这类URL,但语法存在问题:
RewriteRule ^index.php/OLDNAME/(.+?)(?:-2)?/?$ /NEWNAME/$1 [L,NC,R=302,NE]
正确修改方案
你之前的规则错误在于未对index.php中的.转义——正则表达式里.是匹配任意单个字符的通配符,而非字面点号,必须转义为\.才能精确匹配。
方案1:拆分两条规则分别处理
# 处理不带index.php前缀的URL RewriteRule ^OLDNAME/(.+?)(?:-2)?/?$ /NEWNAME/$1 [L,NC,R=302,NE] # 处理带index.php前缀的URL RewriteRule ^index\.php/OLDNAME/(.+?)(?:-2)?/?$ /NEWNAME/$1 [L,NC,R=302,NE]
方案2:合并为一条规则同时匹配两种场景
通过可选分组(?:index\.php/)?匹配是否存在index.php/前缀,一条规则覆盖所有情况:
RewriteRule ^(?:index\.php/)?OLDNAME/(.+?)(?:-2)?/?$ /NEWNAME/$1 [L,NC,R=302,NE]
内容的提问来源于stack exchange,提问作者jlc
相关产品推荐
相关产品推荐

