You need to enable JavaScript to run this app. 如何配置Apache重写规则保留UTM参数实现分语言链接重定向
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 18:15:05