You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.htaccess:URL含utm_source时重定向并追加同名source参数

如何通过.htaccess实现带utm_source参数的URL追加source参数的重定向

需求说明

  • 外部合作伙伴会在我的URL上追加utm参数(如utm_source、utm_medium),我无法控制这些参数的添加
  • 当URL包含utm_source参数时,需要重定向到相同URL,并追加一个source参数,其值与utm_source的取值完全一致
  • 如果URL没有utm_source参数,则不执行任何重定向

示例

原URL:https://example.com/path/index.htm?utm_source=abc&utm_medium=123
重定向后URL:https://example.com/path/index.htm?utm_source=abc&utm_medium=123&source=abc

我尝试过的代码

最初的代码无法正常工作:

RewriteCond %{QUERY_STRING} ^(utm_source=(.*).+)$  
RewriteRule ^(.*)$ $1%1&source=%2 [L]

编辑补充:
感谢@Don'tPanic的帮助后,我写出了接近需求的代码,但会导致无限重定向循环,如何让规则仅执行一次?

RewriteCond %{QUERY_STRING} ^(.*)utm_source=([^&]*)(.*)$
RewriteRule (.*)intro.htm $1intro.htm?%1utm_source=%2&source=%2%3 [R,END]

解决方案

避免无限循环的完整规则

要解决无限重定向问题,核心是添加条件:仅当URL中不存在source参数时才执行重定向。完整规则如下:

# 当URL包含utm_source且未包含source参数时,追加source参数
RewriteCond %{QUERY_STRING} (^|&)utm_source=([^&]+)(&|$)
RewriteCond %{QUERY_STRING} !source=
RewriteRule ^(.*)$ $1?%{QUERY_STRING}&source=%2 [R=302,L]

规则细节解释

  1. 第一个RewriteCond:匹配查询字符串中存在utm_source参数的场景,同时捕获该参数的值到%2
  2. 第二个RewriteCond:排除已经包含source参数的URL,彻底避免重复触发重定向
  3. RewriteRule:保留原URL路径,拼接原查询字符串与source=%2;R=302表示临时重定向(如需永久重定向可改为R=301),L标记表示这是当前匹配的最后一条规则

针对特定页面的调整

如果只需要对特定页面(比如示例中的intro.htm)生效,可修改RewriteRule的匹配规则:

RewriteCond %{QUERY_STRING} (^|&)utm_source=([^&]+)(&|$)
RewriteCond %{QUERY_STRING} !source=
RewriteRule ^(.*)intro\.htm$ $1intro.htm?%{QUERY_STRING}&source=%2 [R=302,L]

内容的提问来源于stack exchange,提问作者Adrien Hingert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:00:06