如何使用htaccess去除URL中的多个文件夹名称?
解决方案
方案1:显式指定支持的文件夹(推荐)
这种方式性能高、不会产生误匹配,你只需要把你需要支持的food、health、beauty等文件夹都加到规则里即可,完整.htaccess代码如下:
<IfModule mod_rewrite.c> RewriteEngine on # 防止重写循环:已经在目标文件夹内的请求不处理 RewriteCond %{REQUEST_URI} ^/(food|health|beauty)/ [NC] RewriteRule ^ - [L] # 检查请求的文件是否在food文件夹下存在,存在则重写 RewriteCond %{DOCUMENT_ROOT}/food/$1 -f RewriteRule ^(.*\.php)$ /food/$1 [L] # 检查请求的文件是否在health文件夹下存在,存在则重写 RewriteCond %{DOCUMENT_ROOT}/health/$1 -f RewriteRule ^(.*\.php)$ /health/$1 [L] # 检查请求的文件是否在beauty文件夹下存在,存在则重写 RewriteCond %{DOCUMENT_ROOT}/beauty/$1 -f RewriteRule ^(.*\.php)$ /beauty/$1 [L] # 其余需要支持的文件夹按上面的格式依次添加即可 </IfModule>
规则逻辑说明:
- 先过滤已经指向子文件夹的请求,避免循环重写
- 按顺序检查根目录请求的php文件是否存在于对应子文件夹中,匹配到就直接内部重写到对应路径,用户端URL不会显示子文件夹名
- 多个文件夹有同名文件时,排在前面的文件夹优先级更高,可以把访问量高的文件夹规则放在最前面提升性能
方案2:自动适配所有子文件夹(无需重复加规则)
如果后续会频繁新增需要隐藏的文件夹,不想每次修改重写规则,可以用自动探测逻辑,代码如下:
<IfModule mod_rewrite.c> RewriteEngine on # 防止重写循环 RewriteCond %{REQUEST_URI} /[^/]+/[^/]+\.php$ [NC] RewriteRule ^ - [L] # 自动遍历所有子文件夹查找匹配的php文件 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+\.php)$ $1 [E=REQ_FILE:$1] RewriteCond %{DOCUMENT_ROOT}/*/%{ENV:REQ_FILE} -f RewriteRule ^[^/]+\.php$ /%1/%{ENV:REQ_FILE} [L] </IfModule>
注意:该方案需要额外的文件存在检查,性能略低于方案1,且如果多个子文件夹下有同名文件,匹配结果不可控,更建议使用方案1。
生效验证
配置完成后,重载Apache配置,清除浏览器缓存后测试即可,原带文件夹路径的访问会自动隐藏文件夹名。
内容的提问来源于stack exchange,提问作者coder2022
相关产品推荐
相关产品推荐

