.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]
规则细节解释
- 第一个
RewriteCond:匹配查询字符串中存在utm_source参数的场景,同时捕获该参数的值到%2 - 第二个
RewriteCond:排除已经包含source参数的URL,彻底避免重复触发重定向 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
相关产品推荐
相关产品推荐

