Safari 隱私模式下,URL 參數為何神祕消失? 作者:南玖 2025-05-07 00:30:00

前言
最近在排查Safari在隱私模式下頁面參數遺失的問題,如果透過Safari直接開啟B頁面,此時在B頁面可以正常取得到頁面連結上的參數,但是如果Safari先開啟A頁面,然後透過A頁面再跳到B頁面(A、B頁面部署在不同網域下),此時的B頁面透過JS就取得不到連結上的參數

問題演示
B頁面連結格式如下:xx.qq.com?au=xx...

透過一下程式碼取得頁面連結及頁面參

如果是隱私模式下單獨開啟B頁面
此時可以看到是能夠正常取得到頁面完整連結(包括參數)的。符合預期

但如果先開啟A頁面,再從A頁面跳到B頁面(A、B網域不同),我們再來看看結果:
從上圖可以看到,此時location.search就已經取得不到了,location.href拿到的值也不再包括location.search了。

那麼Safari在隱私模式下的這種做法是為了做什麼呢?

Safari隱私瀏覽
透過查詢資料後得知,在 Safari 17 中,隱私瀏覽功能更加私密,並新增了防禦措施,以抵禦一些最先進的追蹤技術。技術改進包括:

連結追蹤保護
阻止已知追蹤器的網路負載,包括 CNAME 隱藏的已知追蹤器
高級指紋保護
具有網站或歷史記錄存取權限的擴充功能預設為關閉狀態
連結追蹤保護

在文件上有這樣一段話:

翻譯過來就是:在跨站導航後的目標網站上,所有嘗試讀取完整 URL或參數 的第三方腳本(例如使用 location.search、location.href 或 document.URL)都將獲得一個不含查詢參數或片段的 URL 版本。

也就是說Safari隱私模式下連結參數遺失必須滿足以下兩種情況:

頁面發生了跨域名跳轉
取得連結或參數在第三方腳本中執行(其實就是JS與html模版不在同一個網域下)
解決方案
同域跳轉
既然不同發生跨域跳轉,那麼同域名跳轉是不是就能正常取得頁面連結參數了
同域部署
如果第一種方案滿足不了業務場景,那麼可以嘗試將html模版檔案與JS檔案以相同網域部署,也能規避Safari隱私模式的限制

內嵌腳本
如果你的業務既要跨域跳轉又不想改部署方案,那麼內聯腳本這種方案比較適合你,我們可以在html模版文件內插入一段JS腳本去獲取頁面鏈接及參數,這樣的話這段JS就不屬於第三方腳本了。

比如:
然後再使用的地方直接讀取window上的selfLink、selfSearch

可以看到透過讀取內嵌腳本掛在window上的selfLink、selfSearch可以正常獲取,而直接讀取window.location.href會遺失search參數。