问题描述
最近发现在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 |
|
如果是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 版本】
也就是说,若同时满足以下两个条件:
- 跨域名跳转
- 在第三方脚本中访问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"