如何通过.htaccess隐藏特定子文件夹路径且不影响根目录其他文件
配置错误原因
- 规则逻辑顺序不合理:全局.php后缀补全规则放在了子文件夹路径重写规则之前,内部重定向后会重复触发规则,导致根目录已存在的文件匹配逻辑异常
- 重写条件覆盖不全:最后一条路径映射规则仅排除了已存在的文件,没有排除已存在的目录,当根目录文件存在路径解析歧义时会被误重写
- 子目录放置规则的错误:如果把.htaccess放在
folder子目录内,配置中的RewriteBase /会将规则作用范围扩大到站点根目录,加上.htaccess的继承特性,自然会影响根目录的文件访问
修正后的根目录.htaccess配置
Options +FollowSymLinks -MultiViews RewriteBase / # 先处理带folder路径的301跳转,隐藏路径 RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+folder/([^\s]+) [NC] RewriteRule ^ %1 [R=301,L] # 排除根目录已存在的文件、目录,直接访问不走重写 RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # 处理不带.php后缀的请求,先判断folder下对应.php文件是否存在 RewriteCond %{DOCUMENT_ROOT}/folder/$1.php -f RewriteRule ^([^/.]+)$ $1.php [L] # 将不存在的请求映射到folder目录 RewriteRule ^(.*)$ /folder/$1 [L,NC]
补充说明
- 修正后的规则先判断当前请求的文件/目录在根目录是否存在,存在则直接返回,不会触发后续的folder映射逻辑,完全不影响根目录的index.php等文件访问
- 调整了.php后缀补全的判断逻辑,仅当folder目录下存在对应.php文件时才补全后缀,避免全局规则干扰
- 所有规则仅需要放在根目录的.htaccess中即可,不需要在folder子目录额外放置配置
内容的提问来源于stack exchange,提问作者Marthy_Mc_Fly
相关产品推荐
相关产品推荐

