浏览器隐私策略不同,跳转参数能保下来多少?一份按场景排查的对照清单

浏览器隐私策略不同,跳转参数能保下来多少?一份按场景排查的对照清单
浏览器隐私策略不同,跳转参数能保下来多少?一份按场景排查的对照清单

跳转参数到底丢在哪一段?先分清三个丢失点

上个月有个做内容站的朋友来找我,说他把旧域名往新域名做301,服务器日志里明明看到带着完整的utm参数发出去了,但落地页的统计工具就是收不到来源信息。他一开始以为是统计代码没加载好,折腾了两天,最后发现是浏览器在跳转发生之前就把参数从URL里剥掉了。这事让我意识到,挺多做页面跳转的技术人员对浏览器隐私策略的认知还停在几年前的状态。

跳转参数从A页面到B页面,中间要经过三个可能丢的点:源页面构造链接的时候、浏览器执行跳转的时候、目标页面接收的时候。服务器端的配置问题好查,目标页面的接收逻辑也相对可控,最麻烦的是浏览器在中间那层的处理。不同的浏览器、不同的版本、不同的隐私模式、不同的跳转触发方式,对参数的处理策略差异相当大。

要回答"跳转参数在不同浏览器下能保多少"这个问题,得先把参数分成两类来看。一类是第一方参数,也就是同一个域名内跳转时URL上带的查询参数;另一类是跨域参数,从一个域名跳到另一个域名时传递的参数。第一方参数基本都能完整保留,问题集中在跨域跳转这个场景里。而跨域跳转又分三种触发方式:服务端301或302重定向、前端JavaScript跳转、用户点击普通链接。

接下来的内容会按这三个维度交叉展开:跳转类型、参数位置、浏览器策略。准备阶段先摸清自己的跳转链路属于哪种类型,执行阶段按排查顺序逐一验证,复盘阶段确认哪些参数能保、哪些保不住、替代方案是什么。

准备阶段:先给跳转链路做一次参数盘点

参数放在哪里,决定它能不能活下来

跳转参数不只在URL查询串里。常见的承载位置有三种:URL查询参数、HTTP请求头、Cookie。查询参数最容易受浏览器策略影响,因为URL是浏览器直接处理的字符串。请求头里的Referer在某些隐私策略下会被裁剪成源域名,后面的路径和查询串就丢了。Cookie的保留情况则取决于第一方和第三方的区分。

做盘点的时候,建议把链路里每一个跳转节点标出来,逐个记录参数从哪来、放在哪、经过什么类型的跳转、目标页面用哪个字段接收。拿一条典型的广告归因链路来说:广告点击链接带gclid参数,先经过广告平台的跳转服务,再落到你的落地页,落地页上可能还有一次前端跳转到支付页或详情页。每一段都要单独看。

验收标准是:链路上任意两个相邻节点之间,参数是否完整到达。如果中间有一段被浏览器拦掉,后面所有依赖这个参数的统计都会断。

三个浏览器策略的差异边界

Safari的Intelligent Tracking Prevention,也就是ITP,从2017年开始迭代到现在,对跨域跳转里的跟踪参数处理得最激进。ITP会识别URL里看起来像跟踪标识的参数,比如utm_source、gclid、fbclid,在跨域跳转时主动剥离这些参数。剥离发生在浏览器发出请求之前,所以服务器端日志里看到的URL已经是清洗过的版本。但ITP对第一方域名内的跳转不做剥离,参数在同一个站点内来回跳是安全的。

Firefox的Enhanced Tracking Protection,简称ETP,策略分层比较清晰:标准模式下主要拦第三方Cookie和已知跟踪器,跨域跳转的URL参数默认保留;严格模式下会启用查询参数剥离功能,把已知的跟踪参数从跨域URL里去掉。Firefox的剥离名单是公开维护的,utm系列、gclid、fbclid、msclkid这些都在名单上。第一方跳转同样不受影响。

Chrome的情况相对宽松,但正在收紧。第三方Cookie淘汰的计划已经在推进,跳转参数剥离目前还没有像Safari那样默认开启。Chrome的Privacy Sandbox里有关于链接装饰的限制讨论,但目前正式版本里跨域跳转的查询参数基本能保留。需要注意Chrome的无痕模式,行为可能和普通模式不同。另外,Android端Chrome和桌面端Chrome的策略版本可能有时间差。

还有一个容易被忽略的点:浏览器内置的隐私保护功能之外,用户自己装的广告拦截插件也会剥参数。uBlock Origin和AdGuard这类插件对查询参数的处理比浏览器更激进,有些规则会把一切看起来像跟踪参数的字段都清掉。做排查时如果发现参数丢失但浏览器策略对不上,先让用户关掉插件再测一遍。

执行阶段:按跳转类型逐一验证参数保留情况

服务端301和302重定向

服务端重定向的场景里,参数保留规则和跨域与否直接相关。同域名内做301或302,所有查询参数原样保留,浏览器不会干涉。跨域做301或302时,Safari的ITP会检查URL里的参数名单,命中的参数被剥离后再发出请求。Firefox严格模式下同样处理,Chrome目前不剥离。

这里有一个实际操作中的限制条件:服务端重定向发生在HTTP层,你的服务器日志记录到的就是浏览器实际发出的请求。如果日志里参数已经没了,说明剥离发生在服务器收到请求之前,也就是说浏览器在客户端就做了清洗。如果日志里参数还在,但目标页面的统计代码读不到,那问题在目标页面那一侧,不在浏览器。

验证方法很简单:用浏览器开发者工具的Network面板,勾选Preserve log,观察跳转请求的Request URL。对比三种浏览器的普通模式和隐私模式,在同一个跨域301链路上,你会看到Safari隐私模式下utm参数被删掉,而Chrome普通模式下参数还在。这个对比做完,参数断点的位置就清楚了。

用window.location.href或者location.replace做的跳转,参数保留情况和跳转时构造的URL直接相关。如果前端代码在跳转前手动拼接查询参数,那参数就在目标URL里,浏览器仍然会按跨域规则处理。Safari的ITP对JS跳转同样生效,跨域时剥参数。Firefox严格模式也是同样的逻辑。

但前端跳转有一个服务端重定向没有的变数:跳转前的当前页面脚本可以读取当前URL里的参数,把参数先存到sessionStorage里,跳转后目标页面如果同域可以读回来。这个方案在跨域场景下不成立,因为sessionStorage是域名隔离的。所以前端跳转并不能绕开浏览器策略,只能利用第一方存储做同域内的参数补充。

另一个细节是location.replace和location.href的行为差异。replace不会在会话历史里留下当前页,对参数保留没有直接影响,但在用户点返回时,replace跳转的页面回不到跳转前的那个带参数页面。这对归因回溯有影响,排查时要留意用户从哪个页面进的落地页。

普通链接点击和表单提交

用户点击一个普通的a标签链接,跨域跳转时参数保留情况和重定向一致。Safari ITP会剥跟踪参数,Firefox严格模式会剥,Chrome不剥。但普通链接有一个额外变量:用户点击时浏览器可能触发其他导航逻辑,比如PWA应用里的外部链接打开方式,或者移动端App内嵌WebView的跳转策略。

表单提交的场景更特殊。GET表单提交的查询串由浏览器根据表单字段自动构造,参数名来自input的name属性。如果表单里有一个隐藏字段名字叫utm_source,Safari ITP在跨域提交时同样会剥掉。POST表单的参数放在请求体里,浏览器隐私策略通常不管请求体,所以POST提交的参数能完整到达目标服务器。但POST提交后目标页面的统计代码需要从请求体里取参数,而大多数前端统计脚本只读URL查询串,这里存在一个接收端的断点。

验证时用Network面板看请求的Method和参数位置。POST请求的参数在Payload里,如果目标页面的统计依赖URL参数,那即使POST参数到了服务器,统计端也会少数据。这个断点不是浏览器造成的,但排查时经常被误判为浏览器策略问题。

一个匿名化案例:跨域归因链路的参数断点排查

一个跑教育行业流量投放的客户,日均广告点击量在三千左右,用了外部广告平台的跳转服务。链路是这样的:广告平台点击链接带click_id参数,先跳到广告平台的短链服务做一次302,再跳到客户的落地页,落地页上有一个按钮跳转到咨询页,咨询页和落地页是同域。

客户反馈的问题是:咨询页的转化归因报表里,click_id的覆盖率只有百分之六十几,远低于预期。落地页的访问日志里click_id覆盖率有百分之九十以上。也就是说,从落地页到咨询页这一段,click_id丢了将近三成。

第一反应是前端跳转代码没把参数带到咨询页。检查按钮的跳转逻辑,发现是普通a标签链接,href里手动拼接了落地页URL上的所有查询参数。代码看起来没问题。然后看咨询页的接收逻辑,统计脚本从URL里读click_id,逻辑也对。最后用浏览器实测,发现Safari用户从落地页跳咨询页时,click_id被ITP剥掉了。原因是落地页到咨询页虽然是同域跳转,但落地页本身的来源是跨域302,ITP对整条链路上的跟踪标识做了持续追踪,在后续跳转中继续清洗。

这个细节很关键:ITP的剥离不只发生在跨域跳转的那一步。如果一个跟踪参数在跨域跳转中幸存了下来,它可能在后续同域跳转里被洗掉。Safari把click_id这类参数标记为跟踪标识后,会在一段时间内在所有跳转中清理它。

调整过程分三步。第一步,把click_id从URL查询串挪到第一方Cookie里,在落地页加载时由服务器写入第一方Cookie。第二步,咨询页不再从URL读click_id,改成从Cookie读。第三步,确认落地页和咨询页在同一个主域名下,Cookie的作用域覆盖两个页面。

调整后click_id覆盖率回升到百分之八十几。剩下的缺口主要来自Safari的ITP对第一方Cookie也有七天有效期限制,用户从点击广告到访问咨询页间隔超过七天的场景下Cookie失效。这个限制没法绕过,只能通过缩短归因窗口或改用服务器端session记录来补充。

这个案例的核心教训是:参数丢失不一定发生在跨域那一刻,浏览器隐私策略对跟踪标识的持续清洗会延伸到后续的同域跳转。排查时要把整条链路当成一个整体来看,不要只看一个跳转节点。

复盘阶段:参数保留的检查清单和配置建议

检查项:定位参数断点的五个步骤

  1. 确认跳转类型:服务端重定向、前端跳转、还是普通链接。不同类型的参数处理路径不同。
  2. 确认参数位置:
  3. URL查询串、请求头、还是Cookie。查询串受浏览器策略影响最大。
  4. 确认跳转域名关系:
  5. 同域还是跨域。同域跳转参数基本安全,跨域跳转是重灾区。
  6. 用至少三种浏览器实测:
  7. Safari普通模式、Chrome普通模式、Firefox严格模式。对比参数保留差异。
  8. 检查用户侧插件:
  9. 让用户禁用广告拦截插件后重测,排除插件干扰。

如果业务对归因完整性要求高,且落地页和后续页面同域,优先把关键参数从URL查询串迁移到第一方Cookie。第一方Cookie目前是相对稳定的存储位置,Safari ITP给它七天有效期,Chrome暂未限制第一方Cookie。七天的窗口对大多数转化周期够用,但对长周期转化的业务不够。

如果业务必须跨域传递参数,且目标域是你能控制的,考虑在跳转前把参数通过服务器端接口传递,目标域服务器收到后写入自己的第一方Cookie,再返回跳转响应。这样参数只在服务器之间传输,不经过浏览器的URL清洗。限制条件是两边域名都需要有服务端处理能力,且跳转延迟会增加一点。

如果只能依赖URL参数,接受一部分参数会在Safari和Firefox严格模式下丢失。这种情况下,统计报表里按浏览器维度拆分参数覆盖率,单独监控Safari的覆盖率变化。不要因为总量下降就盲目调整服务器配置,先确认是不是浏览器策略升级导致的。

决策结论:哪些参数能保,哪些保不住

同域跳转的URL查询参数在三种主流浏览器的普通模式下都能完整保留。跨域跳转的utm系列参数在Safari普通模式下就会被剥离,Firefox严格模式下也会被剥,Chrome目前能保。gclid和fbclid这类广告平台专用参数在Safari和Firefox严格模式下同样会被剥。自定义的click_id如果名字不在已知名单里,Safari的机器学习模型可能也会识别为跟踪参数,保留情况不稳定。

第一方Cookie在所有浏览器的普通模式下基本能保留,Safari给七天有效期。第三方Cookie在Safari和Firefox下基本已经不可用,Chrome正在淘汰中。服务器端传递的参数不受浏览器策略影响,是跨域场景下最稳定的方案,但需要两边服务器配合。

跳转参数保留差异这个问题没有统一的解决方案,只能按链路逐段排查、按浏览器分层监控、按业务优先级选择参数承载方案。先摸清自己的链路属于哪种类型,再用检查清单定位断点,最后决定把关键参数挪到哪个位置最稳妥。

AB
关于作者:ABcloakPro 技术团队

ABcloakPro 技术团队拥有 5 年以上 Cloak 技术实战经验,专注研究百度斗篷、谷歌斗篷、AB 页跳转、页面跳转等领域,累计服务超过 1000+ 用户。团队持续跟踪各大广告平台审核规则变化,提供真实可落地的防封策略与配置方案。

本文内容由 ABcloakPro 技术团队原创撰写,基于真实实战经验整理,转载请注明出处:关于我们