.htaccess配置:子目录跳转根目录 排除两个指定子文件夹
子目录.htaccess重定向可行配置
你需要将以下代码完整写入/subfolder/目录下的.htaccess文件即可实现需求:
RewriteEngine On Options +FollowSymLinks # 排除folder1、folder2目录(兼容带/不带尾斜杠、目录下所有子路径) RewriteCond %{REQUEST_URI} ^/subfolder/folder1(/|$) [NC,OR] RewriteCond %{REQUEST_URI} ^/subfolder/folder2(/|$) [NC] RewriteRule ^ - [L] # 其余所有当前子目录下的请求 301永久重定向到根域名 RewriteRule ^ https://www.example.com/ [R=301,L,QSA]
规则逻辑说明
- 前3行是排除逻辑:匹配到访问folder1、folder2本身,或是这两个目录下任意文件、子目录的请求时,直接终止后续重写规则,不做跳转。
(/|$)的写法是为了避免出现类似/subfolder/folder1abc这类路径被误判为folder1目录的问题,NC标记是不区分大小写匹配。 - 最后一行重定向规则:因为
.htaccess放在/subfolder目录内,规则匹配时会自动剥离当前目录的/subfolder前缀,直接用^就能匹配到当前目录下所有请求,统一跳转到根地址,QSA标记会保留原请求携带的查询参数,不需要可以删除。
生效注意事项
- 测试阶段请先把规则里的
R=301改成R=302(临时重定向),避免301永久重定向被浏览器强制缓存,导致调试时看不到最新效果,确认规则完全符合预期后再改回R=301。 - 请确保站点Apache配置中对应目录的
AllowOverride设置为All或是包含FileInfo权限,否则.htaccess中的重写规则不会被服务器读取执行。
之前测试规则失效原因
- 第一版规则的重定向目标是
/$1,本质是把/subfolder下的路径平移到根目录下(比如/subfolder/a.html会跳转到/a.html),不是统一跳转到根域名首页,不符合需求。 - 第二版规则的排除条件没有兼容不带尾斜杠的目录访问路径,同时没有给排除规则加
L标记终止流程,导致排除逻辑被后面的重定向规则覆盖,无法生效。
内容的提问来源于stack exchange,提问作者DaN
相关产品推荐
相关产品推荐

