前幾天看完 WWDC 發佈會,關於 Web 開發的 Web technology sessions at WWDC23 相關議程好像不會對現有網站有什麼重大改變,VisionOS 裡的那個 Safari 在網頁設計與前端,也還不知道有什麼地雷? 何時才有機會玩到?
子彈飛了幾天之後,在一篇外媒報導 iOS 17 automatically removes tracking parameters from links you click on 發現有個驚人的新功能,會把網址裡的一些追蹤用的查詢參數(query string)砍掉。

實測之後發現:
fbclid ❌死
gclid ❌死
utm tag ✅ 活著

不過不要緊張,這功能不是預設就開啟的,
只有在「私密瀏覽」時才會啟用(使用者可以自己改成關閉、僅私密瀏覽、全部瀏覽都啟用)。

但測試後發現 utm tag 也不是每次都會留著,有時候甚至連一些正常的查詢參數都會失蹤,
不曉得是 beta 版的 bug,還是某些網站寫法有問題。
另一個新功能還會直接把 GTM 和 GA4 等廣告追蹤 JS 通通擋掉。
以下來做 iOS17 Developer Beta 版 Safari 的測試:

進階追蹤與指紋保護

這串又臭又長的就是新的功能名稱,在 iOS17 Beta 裡面已經直接有中文名字了,差不多就是原文 Advanced tracking and fingerprinting protections 直翻,還好沒有變成XX寶或XX衛士。
在蘋果官網新聞區有一則 iOS 17 makes iPhone more personal and intuitive ,中文版應該是 Apple 推出強大的全新隱私和安全功能,內容提到

Safari adds greater protection for Private Browsing, both from trackers as a user browses, and from people who might have access to a user’s device. Advanced tracking and fingerprinting protections go even further to help prevent websites from tracking or identifying a user’s device. Private Browsing now locks when not in use, allowing a user to keep tabs open even when stepping away from the device.

Safari「私密瀏覽」的重大更新
Safari 於數年前便先於任何其他瀏覽器推出私密瀏覽功能。今年,一項重大更新將提供更強大的保護,在使用者瀏覽網頁時隔絕追蹤,並阻止可能可以取用使用者裝置的人。進階的追蹤和指紋防護,更進一步協助預防網站使用最新的技術追蹤或辨識出使用者的裝置。「私密瀏覽」視窗也會在未使用時鎖定,讓使用者即使在離開裝置時,仍保持標籤頁開啟。

對於不是網頁技術工程師的人,可能會以為「指紋保護」是手指上真的指紋,或是網頁也可以跟系統要 FaceID 或 TouchID 權限之類的,都不是!
這裡的指紋指的是一些追蹤技術,利用網頁瀏覽器能給的各種資訊,來拼裝出專屬於此裝置的識別號,有興趣的可以看看 fingerprintjs 等各種市面上的產品。
反正先假設看這篇文章的人都知道 utm 參數怎麼用;fbclid、gclid 是什麼東西;分得清 URL 裡面 query string、parameter 和 path 的差異,就不多解釋。

對於使用者,看新聞稿可能覺得沒什麼,畢竟 iOS 前幾代就已經多了一堆設定或新功能,什麼禁止跨網站追蹤、私密轉送(Private Relay)、應用程式透明度(ATT) 之類的,但使用者好像沒什麼感覺,在某某購物網看了馬桶蓋商品,到其他網站去還是會繼續一直看到馬桶蓋廣告,在 Google 搜尋或 Google 的廣告版位點了一個貓飼料廣告,等一下上 FB 或 IG 時又會再看到該品牌的貓飼料,所以每次系統更新說多了一堆隱私加強功能,到底是幹嘛用的?
總之,道高一尺,魔高一丈,邪惡的資本主義會繼續壓迫數位行銷人和工程師,或是各種廣告 AI 新創來圈錢,絕對沒有這麼簡單放過大家,這次 iOS17 又改變了什麼嗎?

升級後第一次開啟 Safari,會看到功能介紹提示(如下圖)

系統設定 > Safari 的進階點進去,也會看到一個「進階追蹤與指紋保護」(如下圖),預設值是「私密瀏覽」,另外還有「關閉」和「所有瀏覽」,總共三個選項。

這功能也不只是在 Safari,在 Mail、訊息 app 中也都會有,但沒看到另外獨立的設定。

進階追蹤與指紋保護會把哪些常用的網頁參數移除?

官方文件找不到對於廣告追蹤的 query string 的 denylist 或 allowlist 之類的,所以先自己手動測試看看有什麼神奇的功效。

實驗1:點擊換頁

實驗方法大致是做了 2 個頁面,上面放了一堆超連結,超連結全部都是 utm_source, utm_medium, utm_campaign, gclid (Google Ads 用的), fbclid (Facebook 用的),先把幾種常用的加好加滿,或是直接到 FB 或 Google 上面 copy 帶有這些參數的網站連結。
因為預設是「私密瀏覽」才會啟用,我改成「所有瀏覽」,方便測試。
然後點擊連結過去之後,再觀察網址列的情況,看尾巴的那堆參數還在不在?

目前測試以下這些:
– gbraid 還在
– wbraid 還在
– _gl 還在,GA4 跨網域追蹤的
– gclid 消失
– fbclid 消失
– fbclid2 還在,只是測試名字取得很像會不會被封鎖
– FBCLID 還在,竟然改大寫就能避掉,不過追蹤程式應該都有 case sensitive,改成大寫應該抓不到
– uid 還在,一些推薦註冊/忘記密碼應該很常用這個名字
– prid 還在
– utm_source 還在
– utm_medium 還在
– utm_campaign 還在
– campaign_id 還在
– click_id 還在
– clickID 還在
– code 還在
– key 還在
– mbextid: 還在

gclid、fbclid 毫不意外的都被移除了。
但是 utm 都還在,可以小鬆一口氣~

2023/10 更新:
iOS17.1 正式版剛發布,算一算 iOS17 已經正式上線1個多月了,看到一個國外的數位行銷團隊也在 2023/10 月底討論這個問題
除了本文測過的,他們又再列舉一些也會被移除的參數,像 twclkd, igshid,有興趣的可以點擊下方連結:
iOS17 Link Tracking: The End of URL Parameters – Lunio

實驗2: 前端跳轉

除了測點擊換頁,還有測前端跳轉,例如把附有 fbclid 的網址放在 js location.href, meta refresh, target blank, js window open 之類的,
上述會被刪掉的參數(gclid、fbclid),結果用這種方式也會被刪掉,
看起來是在每次網頁載入時,蘋果機器都會動得很厲害。

實驗3: app 內的瀏覽器

在 FB 貼文一個沒有帶任何參數的網頁連結,然後從 Facebook app 點擊,
經由 l.php 轉向之後, 還會自動加上 fbclid 嗎? 會。

沒有被移除,真是法外狂徒。

其它實驗

查看瀏覽器的 network 紀錄,發出的請求,真的直接就是沒有那堆參數的網址。
查看主機的 http log,伺服器接到的請求,真的就是沒有那堆參數的網址。
iOS Safari 不是用那種跳轉兩次(先連到有一堆參數的網頁,然後再轉向到沒有查詢參數的)的奧步,

用前端和後端語法把網址印出來看,真的就是沒有那堆參數的網址。
iOS Safari 不是照樣偷偷連過去,只是在查看網址列時在 UI 上顯示一個沒有 query string 的網址來粉飾太平。

一些 URL 很醜的網頁會出問題嗎?

例如公家機關的公告頁面,網址常常長得像這樣: https://www.cib.npa.gov.tw/ch/app/news/view?module=news&id=1885&serno=82d944d9-d6f6-44ec-bebc-46631bcca137
或這樣 https://ca.gov.taipei/News_Content.aspx?n=F72CA83AEB8A10C2&sms=78D644F2755ACCAA&s=E46D0645A1442292
上述的範例後面接了 module, id, serno, n, sms, s 各種用途不明的參數,
這跟 iOS17 要保護的使用者隱私追蹤毫無關係,
只是網站 CMS 的程式是這樣寫,必須要用這麼多參數才能正常載入內容。

比較早期的網站系統很常見這種現象,一個單純的產品頁或文章頁,網址塞了一堆參數變得又臭又長,想減少資料庫的查詢成本吧?
有些還很輕鬆就可以 SQL injection,讓可憐的使用者和後續接手維護的人很煩惱,反正壓時間? 壓預算嘛? 員工或廠商就順應需求,事情做完拿完錢拍拍屁股走人,後面的報應就看誰來承受。

近代的網站,除了搜尋之類的特殊功能頁之外,通常大部分網址結構都做得盡量簡短,例如https://www.apple.com/tw/macbook-air-13-and-15-m2/不會接 N 層命名毫無意義的目錄名稱,也不會接一大堆只有工程師才知道幹嘛用的參數,網頁程式直接依照 route name 或 path name,來查詢判斷要載入什麼內容。Google SEO 也有寫說要盡量保持簡單的網址結構

不過有一些網站可能為了資安什麼的理由,網址真的很簡短,
但是把網址複製分享給別人後,別人點進去永遠只會看到首頁…非常差的設計。

反正找了幾個這種政府機關網頁來測試,幸好在 iOS 17 Safari 跳轉後,這些參數沒有人間蒸發,還是好好的。

但還是碰到一些靈異事件,例如從 Google SERP 上面的廣告,隨便 copy 一個別人的網址,網址後半段的大概長這樣
/Shop/itemDetail.aspx?mNo1=221765&cno=121337&utm_source=Chafee_googleADs&utm_medium=MaxValue_tinysires&utm_campaign=1209_chaphone&gclid=CjwKCAjwm4ukBhAuEiwA0zQxk8-9700sOMoAC4BCReziG_vPD96IPA22dE1kKNrM1CKC5_4OaSaXDBoC0mIQAvD_BwE&m=14&p=1920
mNo1, cno, p 是網站自己的,其他就是 utm 和 gclid。

點擊過去之後,網頁可以正常顯示,但是網站自己的 mNo1, cno, p 參數都不見了?(如下圖)

也就是說,把網址列這串參數遺失的網址貼給別人,說我想買這個,
別人進去只會看到 404 錯誤畫面….

在這個網址參數已經遺失的時候,按重新整理,網頁就會跳到「無此商品」的 404 錯誤畫面。

我另外做個連結,只保留它的 mNo1, cno, p,把 utm 和 gclid 刪掉,點進去,還是一樣發生 query string 遺失的情況,
但是此網站在 iOS15, iOS16 就完全正常,網址整串好好的一字不差,
反正那個網站不是自己的,也不曉得他家的程式是怎寫的,反正電商網站只要銷售業績好,其他問題都不是問題。

這讓我想起前幾年,有些網路行銷公司,為了避免同一頁面 URL 出現各種 fbclid,造成 GA 報表難以統計的情況,有的是在 GA 另外開一個資料檢視,有的是會請網站工程師寫一些 regex 和轉址規則,在進站時直接把 fbclid 參數殺掉。但這無法解釋為什麼網站在 iOS15~16 都正常,iOS 17 開啟設定後會造成正常參數遺失的問題。

問題可以一再重現,不是偶發或是時好時壞,但也不是每個網站都會發生這種情況,但實在太神奇了。

iOS17.1更新:增加了減少進階隱私權保護措施的小提示

在 iOS17 正式版出來之後,Safari 瀏覽器貼心地在視窗上方增加了一個提示:

「若此網頁未如預期顯示,你可以減少進階隱私權保護措施,可能有助於解決顯示問題。」
如果完全依照系統預設值,私密瀏覽時應該會看到這個提示訊息,
使用者不需要把提示按掉,也能繼續操作,
訊息不是固定黏住的。網頁往下捲動時,這塊會跟往上捲然後消失,移到網頁最上面時就會再出現。

因為這塊內容會把網頁視窗可見區域擠下來,有些網頁視覺設計,對於手機第一屏畫面顯示有特殊需求的,又增加了客戶溝通與調整難度…

減少/增加其他隱私權保護措施讓使用者變成 GA4 隱形人

在瀏覽網頁時,Safari 的選單裡面也多出了一個又臭又長的神秘選項(如下圖):

點擊之後網頁會重新載入,變得又慢又卡,按鈕變成「增加其他隱私權保護措施」,
再點一下又會變成「減少其他隱私權保護措施」,功能啟用之後,網頁變得又順又快。
另外還會跑出可怕的數字:


(為什麼追蹤器阻擋功能關閉後,被阻擋的數字反而變多了? 我也不知道…)

這功能厲害在哪?
實測後發現使用者這次真的可以當 GA4 隱形人了,在 GA4 的即時報表完全消失。
以前還要自己裝一堆東西,現在 iOS 系統直接內建。

另外再測試一些知名電商網站,這些公司肯定每天接行銷公司開發電話接到手軟,合理懷疑網站上裝了很多精彩的東西。
把 iPhone 接上電腦,看 iOS Safari 的 Console 訊息,滿滿的 Blocked connection to known tracker…


(畫面太長,只擷一小部分)

ga.js, analytics.js, conversation.js, gtm.js, gtag(GA4 的 G-XXX, measurement protocol 的 DC-XXX), fbevents.js, appier, adsrvr, criteo, TowerData(*.rlcdn), Lotame(*crwdcntrl), ID5, clicky 等追蹤檔案通通擋好擋滿。

ps1.Microsoft Clarity 沒被擋掉,但是如果是裝在 GTM 裡面,GTM 被擋了之後當然也是沒辦法用。
ps2.廣告追蹤器被擋,但是廣告沒被擋,AdSense 之類的廣告都還會在,所以上網時該看到的廣告還是不會變少,但在這個隱私機制運作下,可能會出現更多與自己無關的廣告。

結語

這種移除網址追蹤參數的功能並不是蘋果首創,
Firefox 瀏覽器在 2022 年就出了(Firefox now lets users remove tracking parameters from URLs to enhance privacy),

實測後發現除了阻擋一堆廣告追蹤的 js,追蹤參數只會擋掉 glcid,fbclid 跟 utm 都還會繼續留著。
Firefox 的這個功能也不是預設開啟,要先到瀏覽器設定裡面,把加強型追蹤保護改成「嚴格」,或是 about:config 去手動把 privacy.query_stripping.enabled.pbmode 設成 true,介面上也大大的提醒「此設定可能會造成某些網站無法顯示內容或正常運作」。

很不想被廣告追蹤,使用者還有很多更激進的做法,
例如其它瀏覽器也可以透過第三方瀏覽器套件來移除特定的追蹤參數,
或是在作業系統層級或網通設備層級做處理,這樣就算點了 APP 裡面看到的廣告,也會卡在 https://www.googleadservices.com/pagead/* 連不過去,總之有各種方式來避免被廣告追蹤。

如果要研究參數跑掉之後,會不會造成那些廣告系統、GA4 等等的歸因(attribution) 或其他功能誤判或爆炸,測試起來又更麻煩了,要弄一組廣告給自己看,尤其 GA4 還要至少等一兩天,決定先放棄。

反正預設是 iOS Safari 私密瀏覽時才會啟用,普通瀏覽時基本上沒什麼特殊問題。
現在才 Beta1 (目前更新到 Beta3,功能都還是一樣),正式版也要好幾個月後,通常在新手機發表後才會上,中間可能還會有很多變數。

網頁工程師可能要檢查網頁在 iOS17 Safari 點擊連結換頁後,會不會發生 query string 遺失的情況。
搞廣告做數位行銷的,報表不準或各種報表系統上的「衡量(ㄒ一ㄚㄅㄞ)」數值,也不是一兩天的事了,擔心廣告功勞跑去別人家,追蹤追不到? 大環境如此,繼續擔心也沒用。

延伸閱讀