如何通过.htaccess文件重写URL隐藏查询参数实现伪静态
Apache mod_rewrite 实现动态URL转静态简洁路径方案
现有规则不生效的核心原因
- 路径匹配前缀错误:项目部署在
/project子目录下,现有规则直接匹配^category/开头的路径,没有对应子目录前缀,无法命中目标请求 - 第二条规则存在逻辑错误:
^category/+?$规则没有设置参数捕获组,规则里引用的$1根本取不到任何值,属于无效配置 - 缺少旧地址跳转逻辑:现有规则仅配置了“简洁路径内部映射到PHP脚本”的逻辑,没有实现“访问旧带参URL时自动跳转到无参简洁路径”的逻辑,无法达成隐藏参数的目标
可用配置代码
将以下规则写入.htaccess文件,如果文件放在站点根目录就直接用下面的代码,如果放在project子目录下,就把两条规则里的project/前缀删掉即可:
<IfModule mod_rewrite.c> # 开启重写引擎 RewriteEngine On # 旧带参地址301跳转到简洁路径,隐藏查询参数 RewriteCond %{QUERY_STRING} ^c=([^&]+)$ [NC] RewriteRule ^project/category$ /project/category/%1? [L,R=301] # 简洁路径内部转发到实际PHP脚本处理,地址栏保持简洁路径 RewriteRule ^project/category/([^/\.]+)/?$ /project/category.php?c=$1 [L,NC] </IfModule>
配置说明
- 第一条规则匹配访问
/project/category?c=xxx的请求,通过RewriteCond捕获查询参数里的分类值,用%1引用捕获到的分类名拼接到新路径里,规则末尾的?用于丢弃原请求的查询参数,避免跳转后地址残留多余内容 - 第二条规则匹配
/project/category/electronics这类简洁路径,捕获路径里的分类名传递给category.php的c参数,末尾的/?兼容路径末尾带/和不带/的两种访问场景,NC标记表示路径匹配不区分大小写 - 测试阶段可以把
R=301改成R=302临时跳转,避免301永久跳转被浏览器强缓存导致调试困难,确认逻辑正常后再改回301
内容的提问来源于stack exchange,提问作者vaishnavi
相关产品推荐
相关产品推荐

