如何修改.htaccess配置实现多级目录格式的简洁URL
解决方案
你可以根据自己的需求选择以下两种适配方案:
方案1:全路径作为单个page参数(推荐,支持任意多级目录)
该方案不需要固定路径层级,无论路径有多少级都会完整传递给page参数,后续拓展新层级无需修改重写规则。
修正后的完整.htaccess规则:
RewriteEngine On # 外部跳转:将原始带参数的URL重定向到简洁目录格式 RewriteCond %{THE_REQUEST} \s/+index\.php\?page=([^\s&]+) [NC] RewriteRule ^ /%1? [R=302,L,NE] # 内部重写:将简洁路径映射到实际参数 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]
规则说明:
- 修正了原规则重复判断
!-d的问题,新增!-f判断,保证真实存在的文件/目录不会被重写 - 匹配规则
^(.*)$会捕获完整的路径内容(包含斜杠),直接传递给page参数 - 原有
QSA标志保留,原有额外GET参数会正常传递
方案2:固定两级路径拆分到两个参数
如果你的业务逻辑固定只有两级路径,需要分别映射到p和c两个参数,可以使用该方案:
完整.htaccess规则:
RewriteEngine On # 处理两级参数的外部跳转 RewriteCond %{THE_REQUEST} \s/+index\.php\?p=([^\s&]+)&c=([^\s&]+) [NC] RewriteRule ^ /%1/%2? [R=302,L,NE] # 处理单级参数的外部跳转 RewriteCond %{THE_REQUEST} \s/+index\.php\?p=([^\s&]+) [NC] RewriteRule ^ /%1? [R=302,L,NE] # 两级路径内部重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+)/([^/]+)/?$ index.php?p=$1&c=$2 [L,QSA] # 单级路径内部重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+)/?$ index.php?p=$1 [L,QSA]
规则说明:
- 分别适配单级、两级路径的跳转和重写逻辑
- 两级路径
site.com/mypage/myinfo会映射为index.php?p=mypage&c=myinfo - 单级路径
site.com/mypage会映射为index.php?p=mypage
注意事项
- 测试跳转正常后,可以将
R=302改为R=301,实现永久重定向,有利于SEO - 如果你的站点部署在子目录下,需要在
RewriteEngine On下新增一行RewriteBase /子目录名/,同时调整跳转规则的路径前缀 - 确认Apache配置中已经开启
mod_rewrite模块,且允许目录读取.htaccess文件
内容的提问来源于stack exchange,提问作者BDP
相关产品推荐
相关产品推荐

