# 問題

在 Chrome 開啟抖音網頁版時,點擊部分連結會觸發外部程式呼叫,並出現 bitbrowser://cc/xdg-open 相關訊息。

這不是單純的頁面重新導向問題,而是抖音網頁試圖開啟外部協定,並進一步觸發 xdg-open

# 環境

  • OS: EndeavourOS Linux
  • Browser: Google Chrome
  • Site: 抖音網頁版

# 分析

查問題的過程裡,反覆出現幾個關鍵字:

  • snssdk1128
  • bytedance
  • bitbrowser

從名稱與實際跳轉行為來看,snssdk1128bytedance 和抖音或字節跳動系的外部協定有關;bitbrowser 則不像是抖音官方協定,比較像是第三方軟體留下來的系統關聯。這代表問題不一定是抖音直接把連結送到 bitbrowser,而是網頁觸發外部協定後,本機把請求導到了不預期的目標。

真正需要處理的不是頁面內容本身,而是外部協定的出口。只要 snssdk1128bytedancebitbrowser 這類協定仍能被 Chrome 交給系統,xdg-open 就可能持續跳出相關訊息。

這類問題背後可能同時牽涉:

  • 抖音網頁自己的深層連結邏輯
  • Linux 桌面環境的 URL Scheme 關聯
  • 過去裝過的軟體留下來的 MIME 或處理程式設定

查問題時會一路碰到 mimeapps.listxdg-open、Chrome 的 PreferencesLocal State,但它們其實都在回答同一件事:外部協定最後究竟由誰接手處理。只要其中某一層保留了舊關聯,Chrome 就可能把請求送到不預期的目標。

這篇採用的主要作法,是直接阻止 Chrome 把這些協定交給系統處理。比起逐一清理零散設定,更穩定的做法是在 Chrome 端封鎖這些外部協定,例如透過 policy 的 URLBlocklist 封鎖:

  • snssdk1128://*
  • bytedance://*
  • bitbrowser://*

這樣做的效果,是讓 Chrome 在瀏覽器層就攔下請求,不再交給 xdg-open

# 解決方法

如果主因是 xdg-open 被外部協定觸發,最直接的做法就是在 Chrome 端封鎖這些協定,不讓瀏覽器把請求送到系統。

在 Linux 上,可以建立 Chrome policy 檔案:

sudo mkdir -p /etc/opt/chrome/policies/managed
sudo tee /etc/opt/chrome/policies/managed/blocklist.json >/dev/null <<'EOF'
{
  "URLBlocklist": [
    "snssdk1128://*",
    "bytedance://*",
    "bitbrowser://*"
  ]
}
EOF

建立完成後,完全關閉 Chrome 再重新開啟,接著到網址列輸入:

chrome://policy

如果有成功套用,應該會看到 URLBlocklist 出現在 policy 清單中。

這個做法的重點,是讓 Chrome 在瀏覽器層直接攔下這些協定,而不是等請求送到系統後才交給 xdg-open 處理。只要協定沒有被送出去,相關訊息通常就不會再出現。

# 結論

抖音頁面只是觸發了外部協定;真正讓 xdg-open 訊息出現的,是 Chrome 與 Linux 系統關聯一起把請求送往系統層處理。

這個問題的重點,不是重新導向本身,而是外部協定處理。實際上需要關注的是三件事:

  1. snssdk1128bytedance 這類字眼,多半和抖音或字節跳動系的外部開啟行為有關。
  2. bitbrowser 不一定是抖音本身的東西,比較像是外部軟體留下來的關聯。
  3. 最穩定的處理方式,是直接封鎖協定的外部開啟路徑,避免 Chrome 再交給 xdg-open

遇到「網頁持續嘗試開啟外部 App」的問題時,應該優先檢查協定與系統關聯,並直接處理協定封鎖,而不是只看網頁本身。


本文使用 Codex 輔助撰寫。