如何通过.htaccess重写规则去除GET参数实现两类清洁URL访问
.htaccess 重写规则修正方案
问题根因
- 规则顺序错误:现有匹配短路径的规则优先级更高,
L标记会直接终止重写流程,长路径规则永远不会被触发 - 正则表达式编写错误:你写的
^([a-z_-]+)contest/逻辑是匹配前缀任意字符串+contest结尾的路径段,无法匹配/contest/xxx格式的路径 - 原有两段路径的重写目标配置错误,没有携带
contest参数
正确的完整配置
RewriteEngine On # 更具体的两段路径规则放最前面,优先匹配 RewriteRule ^([a-z_-]+)/([a-zA-Z0-9_-]+)$ index.php?page=$1&contest=$2 [L,QSA] # 再匹配单段路径规则,兼容带/和不带/的场景 RewriteRule ^([a-z_-]+)$ index.php?page=$1 [L,QSA] RewriteRule ^([a-z_-]+)/$ index.php?page=$1 [L,QSA]
规则说明
- 访问
http://www.example.com/contest会匹配后两条规则,重写到index.php?page=contest,符合第一个需求 - 访问
http://www.example.com/contest/this-one-contest会匹配第一条规则,重写到index.php?page=contest&contest=this-one-contest,符合第二个需求 - 无需创建
contest目录,所有请求都会统一交给index.php处理 QSA标记会保留原有URL里的其他查询参数,不会丢失L标记确保匹配到对应规则后不会继续执行后续无用规则,提升重写效率
注意事项
- 请确保你的Apache服务器已开启
mod_rewrite模块 - 站点配置中的
AllowOverride参数需设置为All,否则.htaccess文件不会生效
内容的提问来源于stack exchange,提问作者Colorado Akpan
相关产品推荐
相关产品推荐

