配置.htaccess:隐藏index.php并映射GET变量至路径(不重写URL)
.htaccess配置实现URL伪静态优化
需求说明
现有管理面板的旧URL格式:
/admin-panel/index.php?foo=visual&bar=icons /admin-panel/index.php?foo=visual&bar=templates /admin-panel/index.php?foo=visual&bar=templates&baz=1 /admin-panel/index.php?foo=logs&bar=activity /admin-panel/index.php?foo=logs&bar=transactions /admin-panel/index.php?foo=logs&bar=transactions&baz=23
需要转换成简洁的路径式URL,同时内部将路径段映射为原有的GET参数(foo/bar/baz),对外显示新URL,内部转发到index.php处理:
/admin-panel/visual/icons /admin-panel/visual/templates /admin-panel/visual/templates/1 /admin-panel/log/activity /admin-panel/logs/transactions /admin-panel/logs/transactions/23
.htaccess配置方案
将以下代码保存为.htaccess文件,放在/admin-panel/目录下:
# 开启URL重写引擎 RewriteEngine On # 设置重写的基础目录 RewriteBase /admin-panel/ # 单独处理log/activity(对应原foo=logs的特殊情况) RewriteRule ^log/activity$ index.php?foo=logs&bar=activity [L,QSA] # 匹配三段路径:/xxx/xxx/xxx → 映射为foo=xxx&bar=xxx&baz=xxx RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ index.php?foo=$1&bar=$2&baz=$3 [L,QSA] # 匹配两段路径:/xxx/xxx → 映射为foo=xxx&bar=xxx RewriteRule ^([^/]+)/([^/]+)$ index.php?foo=$1&bar=$2 [L,QSA]
规则解释
RewriteEngine On:必须开启,否则重写规则无效RewriteBase /admin-panel/:指定重写的基准目录,避免路径解析错误- 第一条单独规则:处理你需求里的特殊情况——
/log/activity对应原foo=logs(原参数是logs,新URL是log少了s),确保匹配优先级最高 - 三段路径规则:匹配类似
/visual/templates/1的URL,把三个路径段分别赋值给foo、bar、baz参数,内部转发到index.php - 两段路径规则:匹配类似
/visual/icons的URL,对应foo和bar两个参数 [L,QSA]标记:L:匹配到当前规则后停止后续规则解析QSA:保留用户额外添加的查询参数(比如访问/visual/icons?debug=1时,会自动追加到原URL变成index.php?foo=visual&bar=icons&debug=1)
注意事项
- 确保你的Apache服务器已经启用了
mod_rewrite模块,否则规则不会生效 - 如果把
.htaccess放在网站根目录,需要调整规则路径,比如把^log/activity$改成^admin-panel/log/activity$,同时RewriteBase设为/ - 你的PHP代码可以通过
$_GET['foo']、$_GET['bar']、$_GET['baz']正常获取参数,和原来的逻辑完全兼容 - 如果后续有新的参数格式,可以继续添加对应的RewriteRule规则,注意规则顺序:特殊规则放在前面,通用规则放在后面
内容的提问来源于stack exchange,提问作者Aerdan
相关产品推荐
相关产品推荐

