$p = parse_url($row['target']);
$target = $p['scheme'].'://'.$p['host'].$p['path'].'?'.$p['query'];
header('Location: '.$target, true, 302);
短链后台能看到点击量,落地页的统计里来源全是直接访问,把短链展开看,目标地址后面干干净净,原来的 utm_source 和 utm_campaign 都不见了。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,短链服务生成跳转时只取了目标 URL 的 pathname,查询串在入库那一步就被丢掉。跳转响应又是一个 302,浏览器不会把原链接的参数自动带到新地址。
「短链参数丢失」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
处理上按这个顺序:生成短链时把原始查询串一起存进目标字段,别只存路径;跳转前用 parse_url 取出 query,拼到目标地址后面再发 Location;已经生成的短链批量补一次参数,或者重新生成替换;在统计里按 utm_source 分组验证,确认能对上来路。
改完只确认一件事:点短链打开后地址栏带完整 utm 参数,统计报表里该渠道的会话数不再是零。
