AdGuard 不過濾 localhost:User rules 的 $document 例外規則(Mac/Windows)
要讓 localhost:port/xxxx 這類本機開發網站不被 AdGuard 過濾,到 AdGuard 的 User rules(Windows 版介面為「使用者規則」)加入下面的例外規則,確認規則與 User rules 都已勾選,再回瀏覽器強制重新整理。AdGuard for Windows 實測時,只有 ||127.0.0.1^ 的規則擋不住 HTML 改寫,要再加第三條 |http:// 前綴規則才涵蓋所有 port。
加入例外規則
AdGuard for Mac:
開啟 AdGuard 設定,切換到「過濾器」分頁。
在左側清單選取「User rules」,確認前方核取方塊已勾選;沒勾選時,裡面的規則都不會生效。
在右側規則清單下方按「+」,新增一列並輸入
@@||localhost^$document。依同樣方式加入
@@||127.0.0.1^$document與@@|http://127.0.0.1:$document。確認每條規則前方都已勾選。清單最下方若多出未勾選的空白列,可以忽略,或選取後按「−」刪除。
回到瀏覽器按
⌘⇧R強制重新整理本機網站。
AdGuard for Windows 的位置在「過濾器編輯器」左側的「自訂的過濾器 → 使用者規則」,同樣在右側按「+」逐條加入並勾選,回瀏覽器按 Ctrl+Shift+R 重新整理。
Windows 實測:||127.0.0.1^ 擋不住 HTML 改寫
在 AdGuard for Windows 上,User rules 已有 @@||127.0.0.1^$document 與 @@||localhost^$document ,本機用 Node 在隨機 port 啟動 HTTP 伺服器提供 index.html ,抓回來的內容和原檔仍然不同:
頁面原本的
Content-Security-Policymeta 被換成 AdGuard 的版本,裡面多了local.adguard.org的來源。瀏覽器導覽頁面、頁面內
fetch()、Node 的fetch()抓到的內容都被改寫,不只頁面導覽。每次抓回來的大小都不太一樣,代表注入內容會變動。
同時期只放行單一 port 的 @@|http://127.0.0.1:8942/$document 是有效的:那個 port 上每一種請求都回傳原檔。把這條改成不含 port 的前綴 @@|http://127.0.0.1:$document 之後,隨機 port 也不再被改寫。這個差異的原因沒有在官方文件找到說明; @@||localhost^$document 在 Windows 上是否同樣失效,這次沒有測試。
HTML 被改寫時最明顯的副作用是 PWA:Service Worker 安裝時會比對資產雜湊, index.html 的雜湊對不上,離線快取就裝不起來,頁面顯示類似「離線準備失敗」的訊息。用 Subresource Integrity 或自行比對檔案雜湊的流程,也會出現同樣的不一致。
依範圍選擇規則
只想放行特定 dev server 時,可以把 port 或路徑寫進規則; 3000、 /admin 換成實際值:
所有 port 與路徑:
@@||localhost^$document用 IP 開啟的所有 port 與路徑:
@@||127.0.0.1^$document用 IP 開啟的所有 port(Windows 實測有效的寫法):
@@|http://127.0.0.1:$document只放行一個 port:
@@||localhost:3000^$document,或@@|http://127.0.0.1:3000/$document只放行某個路徑底下的頁面:
@@||localhost:3000/admin^$document
本機開發通常會頻繁更換 port,用不含 port 的規則最省事。
規則語法說明
@@:例外規則的標記,表示放行而不是封鎖。||:從網域開頭比對,同時套用到子網域,所以app.localhost也會被涵蓋。|:放在規則開頭時,表示網址必須從這段文字開始。|http://127.0.0.1:會比對所有以這段開頭的網址,也就是任何 port。^:分隔字元。字母、數字與_、-、.、%以外的字元都算分隔字元,包含:、/、?,網址結尾也算;因此localhost^後面接任何 port 都能比對。$document:用在例外規則時,等同同時套用$elemhide、$content、$urlblock、$jsinject、$extension,也就是整頁不封鎖請求、不套用元素隱藏與內容過濾,也不注入 JavaScript 與 userscript。
如果只寫 @@||localhost^ 而沒有 $document ,只會放行送往 localhost 的請求;頁面載入的第三方資源仍可能被封鎖,元素隱藏規則也仍會作用,畫面看起來還是像被過濾。
驗證方式
強制重新整理本機網站,確認原本被擋的資源或區塊已恢復。
檢視頁面原始碼(Windows 按
Ctrl+U),搜尋local.adguard.org。找得到就代表 HTML 仍被 AdGuard 改寫,例外規則沒有套用到這個網址。需要精確判斷時,把伺服器回傳的內容和磁碟上的原檔比對位元組或 SHA-256;兩者相同才算完全沒被改寫。
若仍異常,開啟 AdGuard 的過濾記錄(Filtering log),重新整理頁面後查看哪些請求被處理、套用了哪條規則。
回頭檢查規則是否打錯字、規則與 User rules 是否都已勾選。
其他做法
AdGuard 瀏覽器助理 :在本機網站開啟 AdGuard 助理,關閉這個網站的過濾開關,AdGuard 會自動在 User rules 新增對應的
$document例外規則。這種做法只會加入當下的網域,不會同時處理127.0.0.1。測試固定 port :自動化測試若無法調整過濾器,可以讓測試伺服器用固定 port,並只放行那個 port,例如
@@|http://127.0.0.1:8942/$document。缺點是 port 被占用時測試會直接失敗。測試開跑前先檢查 :在測試啟動前,用同一個 port 提供一次 HTML 並和原檔比對,不一致就停下並提示改 port 或加例外,避免整批測試跑完才看到一堆不明原因的失敗。
HTTPS 本機站台 :若 dev server 使用自簽憑證的 HTTPS,加了例外規則後仍出現憑證或連線錯誤,可到 AdGuard 設定的「網路」分頁,在 HTTPS 過濾的排除清單加入
localhost,讓 AdGuard 不解密這個網站的流量。