如何配置Apache重写规则保留UTM参数实现分语言链接重定向
问题根因
你现有配置丢失utm_source这类参数的核心原因:
- RewriteRule末尾单独写的
?是mod_rewrite的特殊语法,作用是强制清空原请求携带的所有查询字符串,不会自动保留原有的非lang参数 - 现有规则只单独提取了lang参数的值,没有对查询字符串里需要保留的其他参数做筛选传递
调整后的完整配置
RewriteEngine On # 排除wp-admin目录的所有请求,不参与语言跳转逻辑 RewriteCond %{REQUEST_URI} ^/wp-admin/ [NC] RewriteRule ^ - [L] # 1. 处理en语言场景:移除lang=en参数,保留其他所有查询参数,跳转到根路径 RewriteCond %{QUERY_STRING} (?:^|&)lang=en(?:&|$) [NC] # 提取查询字符串中除lang=en外的剩余参数 RewriteCond %{QUERY_STRING} ^(?:(?:[^&]+&)*)?lang=en(?:&(.*))?$ RewriteRule ^$ /?%1 [L,R=302] # 2. 处理所有非en语言场景:将语言值作为路径前缀,保留除lang外的其他查询参数 # 跳过已经带语言路径前缀的请求,避免重定向循环 RewriteCond %{REQUEST_URI} !^/(de|ar|fr|es|it)/ [NC] # 匹配查询字符串中的语言参数,排除en场景 RewriteCond %{QUERY_STRING} (?:^|&)lang=([a-z]{2})(?:&|$) [NC] RewriteCond %1 !^en$ # 提取查询字符串中除lang参数外的剩余内容 RewriteCond %{QUERY_STRING} ^(?:(?:[^&]+&)*)?lang=[a-z]{2}(?:&(.*))?$ RewriteRule (.*) /%1/$1?%2 [L,R=302]
配置说明
- 非en语言的匹配列表可以根据实际站点支持的语言增删,避免随机字符串触发误跳转
- 跳转时会自动把原查询字符串里的lang参数剔除,不会出现跳转后地址还残留lang参数、触发循环跳转的问题
- 目前用的是302临时重定向,测试逻辑稳定后可以替换为301永久重定向,避免临时缓存影响测试效果
- 对应需求的跳转效果:
mydomain.com/?utm_source=xxx&lang=de会被正确重定向到mydomain.com/de/?utm_source=xxx;如果是带lang=en的请求,会自动去掉lang参数跳转到根路径,完整保留原有utm参数
内容的提问来源于stack exchange,提问作者Antonis
相关产品推荐
相关产品推荐

