如何限制.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
相关产品推荐
相关产品推荐

