You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制.htaccess RewriteRule仅作用于根目录,排除子文件夹?

解决.htaccess重写规则仅作用于根目录的问题

嗨,这个问题我之前配置伪静态的时候也踩过坑!你的规则现在会匹配所有两级路径(包括子文件夹下的),甚至连真实存在的目录请求也会被误触发,所以访问partner文件夹时才会跳转到etel.php。下面给你几个精准的解决方案:

方法1:排除所有真实存在的目录(最稳妥)

直接给规则加一个条件,让它只作用于非目录的请求,同时确保两个路径段都不为空:

# 仅匹配根目录下非空的两级路径,跳过真实存在的目录
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)$ /etel.php?q=$1&n=$2 [L]
  • [^/]+ 代替原来的[^/]*:确保两个路径段都至少有一个字符,避免匹配/partner/这种末尾带斜杠的目录请求
  • RewriteCond %{REQUEST_FILENAME} !-d:告诉服务器“如果请求的不是一个真实存在的目录”才应用规则,这样像partner这种实际存在的文件夹就不会被重写干扰了

方法2:仅排除指定文件夹

如果你只需要排除特定几个文件夹(比如partner),可以用路径匹配的条件:

# 排除partner文件夹下的所有请求
RewriteCond %{REQUEST_URI} !^/partner/
RewriteRule ^([^/]+)/([^/]+)$ /etel.php?q=$1&n=$2 [L]

如果要排除多个文件夹,用竖线分隔即可:!^/(partner|blog|admin)/

方法3:严格限定根目录路径

还可以通过匹配完整请求URI来确保规则只作用于根目录下的两级路径:

# 仅匹配根目录下的两级路径格式
RewriteCond %{REQUEST_URI} ^/[^/]+/[^/]+$
RewriteRule ^([^/]+)/([^/]+)$ /etel.php?q=$1&n=$2 [L]

这个条件会检查请求路径是否严格是/xxx/yyy的格式,不会匹配子文件夹里的路径(比如/partner/xxx/yyy)

选哪种方法看你的需求:如果要避免所有真实目录被干扰,方法1最省心;如果只需要排除特定目录,方法2更灵活。

内容的提问来源于stack exchange,提问作者shouldphp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 19:07:54