REJECT 處理的是命中規則的連線,不是網頁中的個別元素。本文適合已在 Shadowrocket(小火箭)中使用自有設定的使用者:先確認 Config 模式與規則順序,再以精確網域驗證封鎖效果,最後釐清網域不可見、連線重用及同網域內容這三類限制。
REJECT 的作用範圍
REJECT 是規則的處理策略,不是比對關鍵字。DOMAIN,ads.example.com,REJECT 可拆成三部分:DOMAIN 指定比對方式,ads.example.com 是比對值,REJECT 表示命中後拒絕這條連線,而不是像 DIRECT 或代理策略一樣繼續轉送。
這個流程的前提是請求已進入 Shadowrocket 的處理範圍。若連線開關已關閉、未啟用預期的設定,或目前的路由模式不使用這組規則,只加入一行 REJECT 並不代表規則已生效。遭拒後,App 可能顯示空白、載入失敗或繼續重試;畫面表現取決於 App 本身的錯誤處理方式。
REJECT 也不會清除內容。已載入的圖片、本機快取資料及 App 預先載入的推廣畫面,不會因新增規則而立即消失。確認效果時,應查看新請求是否遭拒,而不是只看畫面上還剩下什麼。
先確認 Config 與規則順序
在 Home 中將 Global Routing 設為 Config,再前往 Config 確認目前啟用的設定。不要以 Proxy 或 Direct 模式下的畫面表現,來驗證 Config 分流規則。若原本使用 Scene,先記下場景設定,再切換至明確的 Config 測試條件,減少自動切換造成的干擾。
- 在 Config 中保留原設定的副本,並確認編輯的是準備啟用的檔案。
- 在該設定的
[Rule]區段加入測試規則,並放在可能較早命中的廣泛規則與FINAL之前。 - 儲存並啟用設定,回到 Home 確認
Global Routing → Config,並檢查連線開關。 - 讓目標 App 建立新連線,再查看連線記錄中的目標、命中規則與處理策略;不要只憑一次重新整理頁面就下結論。
一般規則會依排列順序逐一檢查,由最先命中的規則決定處理結果。以下僅示範結構,example.com 系列網域並非實際封鎖清單;FINAL,DIRECT 也只是示範用的預設規則,不應取代既有設定中的最終策略。
[Rule]
DOMAIN,ads.example.com,REJECT
DOMAIN-SUFFIX,metrics.example.com,REJECT
FINAL,DIRECT
若將 DOMAIN-SUFFIX,example.com,DIRECT 放在第一行,連往 ads.example.com 的請求就會先命中這條規則,後面的精確拒絕規則便無法處理該請求。應依實際優先順序排列要保留的精確例外、要拒絕的特定目標與廣泛規則,而不是認為「最後新增的規則優先」。
如何選擇精確網域或網域後綴比對
排查單一目標時,先從 DOMAIN 開始較容易控制範圍。只有確認某個子網域分支整體用途相同,才考慮改用 DOMAIN-SUFFIX。不要因為某個子網域出現不需要的請求,就直接拒絕整個主網域。
精確比對
- 關鍵字
- DOMAIN
- 比對值
- ads.example.com
- 策略
- REJECT
- 範圍
- 僅 ads.example.com
不會一併比對 img.ads.example.com,適合先測試明確的單一目標。
後綴比對
- 關鍵字
- DOMAIN-SUFFIX
- 比對值
- metrics.example.com
- 策略
- REJECT
- 範圍
- 該網域及其子網域
同時涵蓋 metrics.example.com 與 api.metrics.example.com,應先確認用途。
DOMAIN-KEYWORD 會依網域中的關鍵字進行比對,比明確的網域後綴更難控制範圍。例如只用 ad 作為關鍵字,可能會涵蓋許多非目標服務的網域。IP-CIDR 則依 IP 位址網段處理,GEOIP 則依 IP 歸屬地分類處理;兩者都無法指定「網頁中的某一部分內容」。若多個網域共用伺服器或 IP 位址,封鎖 IP 連線可能連帶影響其他網域。
結論:先縮小比對範圍,再逐步擴大
先用一條 DOMAIN 規則確認目標用途與命中結果;確認相關子網域都可以拒絕後,再改用 DOMAIN-SUFFIX。第一輪測試不要直接以整個主網域為目標。
同一網域中的不同內容無法依頁面位置區分
假設正文 API 位於 api.example.com/content,推廣 API 位於 api.example.com/promo。兩者共用同一個網域,一般 DOMAIN 與 DOMAIN-SUFFIX 規則無法依 URL 路徑區分。拒絕 api.example.com 會同時影響這兩類連線,而不會只移除推廣 API。
- 不同網域:內容來自
api.example.com,附加請求來自ads.example.com,可嘗試用精確網域區隔,但仍須確認兩者是否有業務依賴。 - 相同網域、不同路徑:網域規則無法分別處理
/content與/promo。 - 同一回應包含多種內容:正文與推廣資料在同一個回應中傳回,拒絕連線會一併阻擋,無法只移除其中某個欄位。
- App 本機內容:離線資源或已快取的畫面不需要建立新連線,因此不會觸發新的網路規則比對。
HTTPS 常見的目標連接埠是 443,但連接埠本身無法說明請求用途。一般網域規則也不會因此取得加密請求中的路徑或正文。App 內嵌頁面也一樣:關鍵在於目標連線是否獨立、是否有可供比對的網域,而非頁面顯示在瀏覽器或 App 內。
加密 DNS 與網域可見性的限制
網域規則需要可供比對的網域資訊。App 使用系統解析時,解析過程可能與連線建立關聯;若 App 自行使用 DoH 或 DoT,DNS 查詢內容會透過另一條加密連線傳送,不能假設 Shadowrocket 僅憑目標 IP 就能還原查詢的網域。其他連線中繼資料是否可用,也取決於實際流量與設定。
| 情境 | 需要確認的事實 | 不能直接推論的結論 |
|---|---|---|
| 一般 DNS | 解析關聯、目標網域與實際命中的規則 | 看到 DNS 查詢,不代表後續連線一定會命中 REJECT |
| App 內 DoH | 是否連線至獨立的解析端點,以及目標連線是否仍帶有網域資訊 | DoH 常用連接埠 443,不代表所有 443 連線都是 DNS |
| App 內 DoT | 是否存在目標連接埠為 853 的連線,以及該連線的用途 | 僅憑連接埠資訊無法還原查詢內容 |
| 直接連線至 IP | 連線記錄中是否只有 IP 位址,以及是否有其他網域關聯 | 不能假設 DOMAIN 規則一定能比對到該連線 |
遇到這類情況,先確認 Settings 中的 DNS 設定與 App 本身的解析選項,相關說明請參閱DNS 設定參考。拒絕已知的解析端點,可能導致 App 無法解析,也可能觸發備用端點;這不代表已完成對目標內容的封鎖。尤其不要用「封鎖所有 443 連線」取代網域排查,否則一般 HTTPS 連線也會受到影響。
進行可重複檢查的封鎖測試
測試時一次只更動一個變數。頁面上的空白區域、載入時間與錯誤提示都只是間接現象;更有用的證據是目標為何、哪條規則先命中,以及最後採用什麼策略。以下流程用於檢查使用者已有的設定,不涉及取得任何連線服務。
- 記錄基準狀態:儲存目前設定,記下 Global Routing 模式、目標網域,以及尚未新增規則時的頁面表現。
- 只新增一條規則:將已確認的目標寫成
DOMAIN,ads.example.com,REJECT這類完整規則;實際測試時請使用自己記錄的網域,不要把範例網域當成有效清單。 - 重新建立連線:結束目標 App 後重新開啟,必要時重新建立 Shadowrocket 連線。既有的長時間連線可能繼續重用,單次重新整理不一定會觸發新的規則判斷。
- 確認命中結果:查看新連線的目標、規則與策略。若結果仍是 DIRECT 或代理策略,先確認設定是否已啟用,以及前面是否有更早命中的規則。
- 檢查連帶影響:依序測試登入、正文載入、圖片與提交操作。若出現異常,先移除新增規則,再重做相同操作以供比較。
也要記錄自動連線狀態。Settings → On Demand 用於管理依條件連線的行為,不能取代 REJECT 規則;測試期間若連線狀態隨網路變動,應先確認請求當時是否進入隧道。不要同時修改 On Demand、DNS 與規則清單,否則難以判斷結果變化由哪項設定造成。
常見現象與排查方式
新增 REJECT 後,為什麼頁面內容還在?
先重新開啟目標 App,確認是否有新連線命中 REJECT。若記錄顯示連線已遭拒,但畫面內容仍存在,請檢查快取、本機資源或同一回應包含多種內容的可能性,不要立刻擴大到整個主網域。
為什麼一封鎖就無法登入?
先移除新增規則,再重新測試登入。若功能恢復,請將 DOMAIN-SUFFIX 縮小為已確認的 DOMAIN,並分別測試驗證介面與附加請求;同一網域若有多種用途,應保留必要連線。
為什麼連線記錄只有 IP,沒有網域?
確認 App 是否直接連線至 IP、是否使用內建加密 DNS,並檢查 Settings 中的 DNS 設定。不要任意擴大封鎖範圍至整個 IP 網段;共用 IP 可能承載其他服務,應先確認目標及誤封鎖範圍。
更新設定後,手動新增的規則為什麼不見了?
前往 Config 再次確認目前啟用的檔案及其規則內容。遠端設定更新與 Home 中既有訂閱的伺服器清單更新並非同一回事;替換設定前請保留本機副本,更新後確認自訂規則是否仍在預期位置。
最終判斷標準是「指定連線依預期遭拒,必要功能仍可使用」,而不是保證所有 App 都不再出現某類內容。REJECT 適合處理可獨立辨識的目標連線;若內容與必要服務共用網域、連線或回應,就應接受網域分流的限制,而不是不斷擴大封鎖範圍。