如何去除URL路径中的index.php且保留/index.php/路径不变
现有规则失效原因
.htaccess上下文下RewriteRule的匹配路径会自动剥离当前目录对应的前缀,不会包含前导斜杠,你写的/index.php/开头的匹配模式无法命中任何请求,导致预设的例外条件完全没有生效。- 部分服务器默认开启了
MultiViews内容协商功能,会对index.php这类文件路径做隐式匹配,即使路径不完全符合规则也会触发重写逻辑,导致例外场景被误处理。
适配需求的正确重写规则
用在根目录 .htaccess 文件的配置
RewriteEngine On # 关闭内容协商,避免隐式匹配导致的规则异常 Options -MultiViews # 仅匹配 index.php/ 后存在至少1个非空字符的请求,自动忽略 /index.php/ 路径 RewriteRule ^index\.php/(.+)$ /$1 [L,R=301,NC]
用在Apache主配置/VirtualHost段的配置
如果规则不是写在.htaccess里,而是写在全局服务配置或虚拟主机配置段中,需要保留路径前导斜杠:
RewriteEngine On Options -MultiViews RewriteRule ^/index\.php/(.+)$ /$1 [L,R=301,NC]
规则说明
- 匹配模式里的
(.+)要求index.php/后必须有至少1个字符,/index.php/路径本身不会被命中,不需要额外写RewriteCond做例外判断,逻辑更简洁。 - 如果你需要的是内部重写(用户浏览器地址栏不显示跳转后的路径),删除规则末尾的
R=301参数即可;L表示命中当前规则后不再执行后续重写逻辑,NC表示匹配时忽略大小写。
内容的提问来源于stack exchange,提问作者stckvrw
相关产品推荐
相关产品推荐

