如何重定向含index.php的URL并排除index.php?route=路径
问题原因
你之前写的排除规则不生效,核心是两个写法错误:
%{THE_REQUEST}变量的完整格式为请求方法 空格 请求URI 空格 HTTP版本(示例:GET /index.php?route=abc HTTP/1.1),所以不可能以index.php开头,你写的起始锚点^和路径前缀都不符合实际变量内容- 正则中
?是元字符,代表匹配前一个字符0/1次,要匹配字面量的问号必须加转义符\ - 额外补充:
RewriteCond仅对紧跟在后面的第一条RewriteRule生效,你原来的写法只给第一条重定向规则加了排除条件,第二条处理index.php/的规则不受约束,也会导致排除逻辑不完整
调整后的完整配置
# 处理带index.php后缀的请求,先排除带route参数的场景 RewriteCond %{THE_REQUEST} !/index\.php\?route= [NC] RewriteCond %{THE_REQUEST} ^.*/index\.php RewriteRule ^(.*)/index.php|index.php$ $1 [R=301,L] # 处理带index.php/路径前缀的请求,同样先排除带route参数的场景 RewriteCond %{THE_REQUEST} !/index\.php\?route= [NC] RewriteRule ^(.*/)?index\.php/(.*) /$1$2? [R=301,L]
规则说明
- 两条重定向规则前分别加了独立的排除条件,匹配请求URI中存在
/index.php?route=的请求时跳过当前重定向 - 加
NC标志实现不区分大小写匹配,避免大小写差异导致规则失效
内容的提问来源于stack exchange,提问作者user16462554
相关产品推荐
相关产品推荐

