.htaccess配置Rewrite规则去除.htm后缀不生效是什么原因?
.htaccess去除.htm后缀规则不生效原因说明
核心失效原因
- 匹配规则不符合.htaccess的路径匹配逻辑
Apache在处理目录级.htaccess的RewriteRule规则时,会自动裁剪掉请求路径的前导斜杠
/以及当前目录的路径前缀后再进行正则匹配,你原有规则以^/开头,永远无法命中任何请求,因此规则完全不会触发。
- 正则覆盖范围过窄
原有规则的正则^/([^./]+)\.htm$仅能匹配根目录下、文件名不含小数点的.htm文件,子目录下的.htm文件、文件名带特殊字符的.htm文件都无法匹配,覆盖场景非常有限。
可用规则逻辑说明
你提供的可正常运行的规则解决了上述两个问题:RewriteRule ^(.*)\.htm$ $1/ [R=301,L]
- 没有添加前导斜杠,符合.htaccess的路径匹配规则,可以正常命中请求
- 正则
.*支持匹配任意层级路径、任意文件名格式的.htm后缀请求,覆盖所有需要重定向的场景 - 搭配你原有配置的
RewriteCond %{REQUEST_FILENAME} !-f条件,逻辑合理,不会影响真实存在的.htm静态文件的访问。
额外注意事项
- 该重定向规则需要放在WordPress默认的固定链接重写规则之前,避免被WordPress原生规则优先拦截导致失效
- 修改完.htaccess后需要清空浏览器缓存和站点缓存,301属于永久重定向,会被浏览器长期缓存,旧的缓存结果会导致测试时看起来规则未生效。
内容的提问来源于stack exchange,提问作者user3161924
相关产品推荐
相关产品推荐

