.htaccess如何实现带参数URL去除语言前缀的301重定向
需求说明
需要实现的Apache重定向规则逻辑如下:
- 触发条件:URL最后一个
/后带有?及后续查询参数,且路径开头包含两位的语言路径段(如/fr/、/en/等) - 跳转逻辑:移除路径开头的语言段,完整保留原地址的所有查询参数,做301永久重定向
- 示例:
访问地址:https://example.com/fr/contact-us/?utm_medium=email
目标地址:https://example.com/contact-us/?utm_medium=email - 原有规则的问题:你之前写的片段仅匹配
utm_medium为纯数字的查询参数场景,没有覆盖任意查询参数的情况,也未正确处理路径里的语言段移除逻辑,无法生效。
可用重定向规则
将以下代码写入网站根目录的.htaccess文件,或对应站点的Apache虚拟主机配置中即可:
RewriteEngine On # 匹配带两位语言前缀、末尾带斜杠且携带查询参数的请求 RewriteCond %{REQUEST_URI} ^/[a-z]{2}/(.*)/$ [NC] RewriteCond %{QUERY_STRING} . # 执行跳转,保留全部原有查询参数 RewriteRule ^ /%1/? [L,R=301,QSA]
规则细节说明
- 第一行
RewriteEngine On是开启重写引擎的必备前置语句,如果文件里已经有这行不用重复添加 - 路径匹配规则
^/[a-z]{2}/(.*)/$会捕获所有开头为两位字母语言段、末尾带斜杠的路径,自动把语言段之后的路径内容存入变量%1,[NC]标识不区分大小写,支持/FR/、/En/这类大小写混合的语言路径写法 - 查询参数判断条件
%{QUERY_STRING} .会筛选所有携带非空查询参数的请求,避免无参数的普通路径被误跳转 - 跳转标识说明:
R=301代表永久重定向,注意:规则测试阶段请先把301改成302,确认跳转逻辑符合预期后再改回301,避免浏览器缓存错误规则导致长期访问异常L代表匹配到该规则后停止处理后续重写规则,避免规则冲突QSA标识会自动把原请求的所有查询参数完整追加到跳转后的地址上,不会丢失任何参数
- 跳转目标末尾的
?是为了避免系统自动重复拼接查询参数,和QSA配合可以保证参数完整且不出现重复问题
内容的提问来源于stack exchange,提问作者user8463989
相关产品推荐
相关产品推荐

