Safari无痕模式取不到url中的参数?

问题描述

最近发现在Safari17中用户使用我们的服务时出现了一些问题,从A页面跳转到B页面,B页面无法正常运行,但是直接复制B页面链接在新标签页访问没有问题。该问题只影响Safari17无痕浏览模式,在iOS和macOS上均出现同样问题。

经过排查后发现,B页面在获取location.href时只能获取到?前面的部分,即location.search部分全部丢失。比如说我们的页面链接是https://example.com?a=xxx&b=xxx&c=xxx,但是通过location.href获取到的url是https://example.com

同时我们尝试了从同域名跳转到B页面以及从不同域名跳转到B页面,发现只有在域名不相同时跳转会出现这个问题。

同时尝试了其他方法,比如直接在html文件中,或者同域名脚本中访问location.href,发现是没有问题的。

在网上搜索之后,我们考虑到是否是因为Safari17中新增加的高级跟踪和指纹识别保护(Advanced Tracking and Fingerprinting Protection)功能所做的限制,它其中的一个功能是会删除链接中的查询参数,也就是链接追踪保护。

forums.developer.apple.com/forums/thre…

链接追踪保护

链接追踪保护(Link Tracking Protection):苹果公司在最新的 iOS 17 和 macOS Sonoma 系统中推出了一项新功能,这项功能可以在 Safari 私密浏览模式、信息和邮件应用中,自动删除 URL 中的追踪参数,让链接变得简洁而干净

什么是链接追踪保护?

LTP 将删除添加到某些 URL 末尾的一些跟踪信息。以下是 Apple 的新闻稿中关于此功能的说明:

“一些网站会在其 URL 中添加额外信息,以便在其他网站上跟踪用户。现在,这些信息将从用户在信息和邮件中分享的链接中删除,并且链接仍将按预期工作。这些信息也将从 Safari 隐私浏览中的链接中删除。”

什么是跟踪参数?它只是 URL 末尾的额外信息。当我们在网上浏览或复制一个链接时,它的末尾可能会携带一些看不懂的字符,这些字符其实是广告商用来追踪我们行为的参数,它们可以记录我们从哪里来、去了哪里、点击了什么等等。这样一来,广告商就可以根据我们的喜好和习惯,向我们推送定制化的广告。

哪些跟踪参数被删除了?

目前了解到以下参数会被删除:

  • gclid - Google AdWords // 分析
  • dclid - Google 展示广告网络
  • foclid - Facebook 广告
  • twelkd - Twitter 广告
  • msclkid - 微软广告
  • mc_eid -Mailchimp
  • igshid - Instagram

示例:链接

非IOS17点击链接

1
2

`https://example.com?fbclid=IwAR4HesRZLT-fxhhh3nZ7WKsOpaiFzsg4nH0K4WLRHw1h467GdRjaLilWbLs&utm_source=facebook&utm_medium=cpm&utm_campaign=test_campaign`

如果是IOS17并点击了邮件、信息或隐私模式下的Safari中的链接

1
`https://example.com?utm_source=facebook&utm_medium=cpm&utm_campaign=test_campaign`

可见faclid参数被删除了

对location.href的影响

以上似乎并不能解释我们遇到的问题,我们的参数并没有包含这些跟踪参数,在路径栏看到的也是完整的页面链接。

因此,继续查阅其他资料,发现这个链接追踪保护功能对我们的网站还有一些其他的影响

webkit.org/blog/15697/…

大致意思就是【在跨站点导航后的目标网站上,所有尝试读取完整 URL 的第三方脚本(例如使用 location.search、location.href 或 document.URL)都将获得不含查询参数或片段的 URL 版本】

也就是说,若同时满足以下两个条件:

  1. 跨域名跳转
  2. 在第三方脚本中访问location.href或者location.search或者document

将无法从url中获取query参数

刚好,我们的页面的html文件和js文件部署在不同的域名下,同时A站点跳转到我们的站点,域名也不一致,刚好踩中两个条件,导致了这个问题的发生。

总结

若从A页面跳转到B页面,两个页面在不同域名下,且B页面引入了第三方脚本(即js文件域名与html不一致),则在Sarafi的无痕浏览模式中会出现B页面的第三方js文件中无法获取到url中的参数的问题。

这里提到的页面跳转,我尝试了以下三种方式,都会出现上述问题:

  • a标签
  • window.open方法
  • location.href="xxx"

参考文章

webkit.org/blog/14205/…

webkit.org/blog/15697/…

usefathom.com/blog/ios17-…