根目录.htaccess无法忽略/other_cms及其子目录:问题排查求助
解决根目录.htaccess规则不作用于/other_cms路径的问题
咱们一步步拆解你遇到的问题,核心其实是两个点:根目录的排除规则没写对,以及子目录的.htaccess没被Apache读取,下面逐个解决:
一、修正根目录的Rewrite排除规则
你之前写的几条规则要么覆盖不全,要么条件判断有误,导致没达到预期效果:
- 第一条
RewriteRule ^other_cms/ - [L]只能匹配带末尾斜杠的路径(比如/other_cms/),但访问/other_cms(不带斜杠)时就不会触发这条规则,后续规则还是会执行 - 你用
RewriteCond %{REQUEST_URI} !^other_cms(/.*|)$时,忽略了%{REQUEST_URI}的值是以斜杠开头的(比如/other_cms/test),所以这个正则根本匹配不上,排除条件等于没加
最简洁有效的写法
直接在所有Rewrite规则的最顶部加这一条就够了,能覆盖/other_cms本身、/other_cms/、/other_cms/test等所有相关路径:
RewriteEngine On # 匹配所有以other_cms开头的路径,直接跳过后续规则处理 RewriteRule ^other_cms(/.*)?$ - [L,NC]
^other_cms(/.*)?$:正则里的(/.*)?是可选部分,既匹配不带斜杠的/other_cms,也匹配带斜杠的所有子路径[L]:告诉Apache这是最后一条要执行的规则,匹配到就停止后续处理[NC]:不区分大小写,避免路径大小写变化导致规则失效
如果你偏好用RewriteCond的方式
一定要记得给正则加上前导斜杠,因为REQUEST_URI天生带斜杠:
RewriteEngine On # 只有当请求路径不是/other_cms及其子路径时,才执行后续规则 RewriteCond %{REQUEST_URI} !^/other_cms(/.*|)$ # 这里放你原本的其他Rewrite规则,比如和cms相关的规则 RewriteRule ^cms/(.*)$ ... [L]
二、让子目录的.htaccess生效
你在/other_cms里加的RewriteEngine Off没起作用,大概率是Apache的**AllowOverride配置被限制**了:
- 打开Apache的主配置文件(比如
httpd.conf或者apache2.conf),或者你的虚拟主机配置文件,找到网站根目录的<Directory>块,确保AllowOverride设置为All,至少也要是FileInfo(因为RewriteEngine属于FileInfo类的指令):
<Directory "/path/to/your/website/root"> AllowOverride All </Directory>
- 修改完配置后,重启Apache服务,新配置才会生效
怎么验证是否解决?
- 访问
/other_cms/test,看看还会不会触发/cms相关的404错误 - 可以在
/other_cms/.htaccess里加个简单的测试规则,比如Redirect /other_cms/test /test-success,访问这个路径如果跳转到/test-success,说明子目录的.htaccess已经被读取了
内容的提问来源于stack exchange,提问作者Dollique
相关产品推荐
相关产品推荐

