Apache mod_rewrite实现带查询参数URL转SEO友好URL并忽略指定参数
Apache mod_rewrite 忽略指定参数重定向配置方案
前置要求
- 确保Apache已经启用
mod_rewrite模块,主机配置中已经开启AllowOverride All允许.htaccess文件生效。
配置逻辑说明
无需判断参数排序,直接提取需要保留的p1、p2参数值,其余p3到p6等不需要的参数会自动被忽略,最终拼接为SEO友好的路径格式URL执行重定向。
完整配置代码
将以下代码写入站点根目录的.htaccess文件即可:
<IfModule mod_rewrite.c> RewriteEngine On # 提取p1参数值存入环境变量,不限制参数位置 RewriteCond %{QUERY_STRING} (?:^|&)p1=([^&]+)(?:&|$) RewriteRule ^my-page$ - [E=P1_VAL:%1] # 提取p2参数值存入环境变量,不限制参数位置 RewriteCond %{QUERY_STRING} (?:^|&)p2=([^&]+)(?:&|$) RewriteRule ^my-page$ - [E=P2_VAL:%1] # 两个参数都提取完成后执行301重定向,丢弃原始查询参数 RewriteCond %{ENV:P1_VAL} .+ RewriteCond %{ENV:P2_VAL} .+ RewriteRule ^my-page$ /my-page/%{ENV:P1_VAL}/%{ENV:P2_VAL}? [L,R=301] </IfModule>
配置说明
- 正则规则
(?:^|&)会匹配参数的起始边界,避免匹配到其他名称后缀带p1/p2的参数,([^&]+)会自动提取参数值直到遇到下一个&或查询串结束 - 前两条
RewriteRule仅做环境变量赋值,不会触发跳转 - 跳转规则末尾的
?作用是丢弃原始查询参数,不会把旧的参数串带到新URL中 - 不需要额外添加忽略
p3-p6的规则,所有未被显式提取的参数都会被自动忽略 - 如果需要适配多个页面的通用规则,可以把路径匹配规则
^my-page$修改为动态正则,比如^([a-z0-9-]+)$,跳转路径对应改为/$1/%{ENV:P1_VAL}/%{ENV:P2_VAL}?即可
测试注意事项
- 测试阶段可以先把
R=301改为R=302,避免浏览器缓存旧的301规则影响测试结果,确认功能正常后再改回301 - 如果配置写在虚拟主机配置文件而非.htaccess中,需要重启Apache服务后生效
内容的提问来源于stack exchange,提问作者mrjayviper
相关产品推荐
相关产品推荐

