本文適合已在 Shadowrocket(小火箭)設定好連線,準備調整分流規則的使用者。請先確認 Global Routing 設為 Config,再依「具體例外在前、範圍規則在後、FINAL 最後」整理設定,並透過單筆請求記錄確認實際命中的規則。連線資訊與訂閱請向服務供應商取得;本文僅說明規則排序、驗證與還原方式。
先確認 Config:規則順序生效的前提
修改規則前,先到 Home → Global Routing 確認目前的路由模式。本文討論的是選擇 Config 後,當前設定中 [Rule] 清單的比對順序。只修改檔案,卻讓 Global Routing 停留在 Proxy 或 Direct,無法用來驗證這組規則是否如預期生效。
Global Routing 的模式名稱與規則列中的策略名稱,屬於不同層級的設定。例如,Proxy 是路由模式,PROXY 則是規則列的目標策略。兩者拼法相近,但不要把「選擇 Proxy」理解成「只有 PROXY 規則會生效」。
Config
建議依目前設定執行分流。請求可能由某條具體規則處理,也可能交由 FINAL;實際路徑取決於命中的策略。
適用情境:編輯規則、確認命中順序,以及日常依設定分流。
Proxy
以代理模式處理流量,不會依本文所述的規則清單逐條決定分流。可用來確認代理連線本身是否可用,但無法據此證明規則正確。
適用情境:暫時確認連線是否可用,區分代理故障與規則選擇錯誤。
Direct
以直連模式處理流量。此時存取成功或失敗,不能直接歸因於剛修改的 PROXY 或 REJECT 規則。
適用情境:確認本地網路的直連狀況,對照完成後切回 Config。
判斷方式:先固定模式,再修改一條規則
將 Global Routing 固定為 Config,並保持所選連線不變;每次只調整一條規則或一個位置。如此才能將請求路徑的變化與這次修改對應起來。
由上而下比對:規則更具體,不代表自動優先
在一般規則清單中,Shadowrocket 會依由上而下的順序檢查規則。只要某條規則符合並決定處理策略,就不會繼續尋找下方「看起來更精確」的規則。優先順序主要取決於排列位置,而非網域長短,也不是由 DIRECT、PROXY 或 REJECT 的名稱決定。
以下使用保留的範例網域說明規則衝突,不代表可直接存取的測試服務。假設整個 example.com 都需要 PROXY,但其中的 api.example.com 是需要 DIRECT 的例外,就必須將例外規則放在範圍規則前面。
[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT
api.example.com:先符合第一行,執行 DIRECT;不再檢查下一條 DOMAIN-SUFFIX。www.example.com:不符合第一行,符合第二行,執行 PROXY。- 其他未被前兩行涵蓋的請求:繼續比對 FINAL,執行 DIRECT。
如果將第二行移到第一行之前,api.example.com 就會先被 DOMAIN-SUFFIX 符合,後面的 DIRECT 例外便沒有機會執行。同理,放在範圍規則後面的 REJECT 也不會自動取得較高優先順序。
DOMAIN-SUFFIX,example.com,PROXY 並非在 URL 中任意搜尋文字;網址路徑中出現 example.com,不會因此符合。規則參數應填寫網域,不要加入 https://、頁面路徑或查詢參數。若只要處理單一主機名稱,建議用 DOMAIN 描述這項例外。
FINAL 設定方式:指定未符合其他規則時的處理方式
FINAL 是不附帶網域或 IP 條件的最終兜底規則。常見寫法包括 FINAL,DIRECT 或 FINAL,PROXY。它不是「只比對無法識別的網站」,而是處理所有到達該行、尚未被前面的規則處理的請求。
因此,FINAL 應放在 [Rule] 清單的最後,而不是整份設定檔的最後。設定檔可能還包含其他區段;移動 FINAL 時,請勿將它移到其他區段。若 FINAL 提前出現,後面的普通規則就沒有比對機會。
| 設定方式 | 未符合規則時的結果 | 檢查事項 |
|---|---|---|
FINAL,DIRECT | 其餘請求直接連線。 | 需要代理的網域是否已由前面的規則涵蓋。 |
FINAL,PROXY | 其餘請求交由 PROXY 處理。 | 本地網路及需要直連的目標,是否已設定明確例外。 |
FINAL,REJECT | 其餘請求一律拒絕。 | 是否確實要採用嚴格的允許清單,並能接受遺漏項目造成無法存取。 |
以下是獨立的最小結構範例,用來說明網域規則、IP 規則與兜底規則的位置。這不是完整的日常設定:範例只列出一段私有 IP 位址範圍,未涵蓋所有本地網路情況。請在現有設定的副本中合併所需規則,不要再新增第二個 [Rule] 區段。
[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
IP-CIDR 用來檢查 IP 位址範圍;GEOIP 依據 IP 地理資料庫分類,不能據此判斷內容所屬地區或營運者所在地。範例中的 no-resolve 表示不要只為這條 IP 規則主動解析網域,不代表整份設定都不會進行 DNS 查詢。IP 規則能否符合,也取決於該次請求可用的目標位址資訊。
PROXY、DIRECT、REJECT:分別查看比對條件與處理動作
規則列前半部用來指定「比對什麼」,最後的策略則回答「符合後如何處理」。同一條 DOMAIN-SUFFIX 可以搭配不同策略;策略本身不會改變比對範圍,也不會提升該規則的排列優先順序。
- PROXY
- 將請求交由代理路徑處理。實際使用的連線仍取決於目前的選擇及設定中的策略安排;符合 PROXY 不代表伺服器連線、驗證或目標存取一定成功。
- DIRECT
- 透過本地網路直接連線至目標。適用於已確認需要直連的網域或位址範圍;DIRECT 不會自動修正 DNS 錯誤、本地網路封鎖或目標服務故障。
- REJECT
- 拒絕符合條件的請求。適用於明確需要封鎖的單一網域或位址;請先確認比對範圍,避免連登入、驗證或頁面資源也一併封鎖。
例如 DOMAIN,metrics.example.com,REJECT 只表示封鎖這個範例主機名稱。如果正常內容與待封鎖請求共用同一網域,DOMAIN 或 DOMAIN-SUFFIX 無法依網頁路徑將兩者區分。將整個網域設為 REJECT,可能同時造成圖片無法顯示、按鈕失效或頁面載入中斷。
- 需要設定直連例外:將特定 DOMAIN 的 DIRECT 規則放在範圍較廣的 PROXY 規則之前。
- 需要封鎖單一網域:先從請求記錄確認實際主機名稱,再新增 REJECT,不要根據頁面上的文字猜測網域。
- 需要依 IP 分類:確認目標位址、遮罩與資料庫分類結果,不要把 GEOIP 當成網域所屬地區的保證。
規則決定流量去向,協定則決定如何建立代理連線。將 PROXY 對應的連線從一種協定換成另一種,不會改變 DOMAIN-SUFFIX 的比對範圍。排查時應先確認「路徑是否正確」,再檢查該路徑能否順利完成連線。
修改與驗證:保留副本,逐條確認命中結果
以下操作以已有可用連線及設定為前提。訂閱與設定檔是不同項目:在 Home 更新訂閱,不代表目前 Config 中的規則會自動調整為你需要的順序。修改前,請先確認正在編輯的是實際選用的檔案,並保留可還原的副本。
-
保留副本
在 Config 中確認目前選用的檔案,先保留原檔副本或匯出備份。若檔案來自遠端更新,請使用獨立的本機副本進行修改,避免後續更新覆蓋內容。
-
固定路由模式
前往
Home → Global Routing → Config,並保持目前選用的連線不變。同一次驗證中,請勿同時切換路由模式、連線與規則檔案。 -
編輯規則
前往
Config → 目前檔案右側 ⓘ → Edit Plain Text,找到[Rule]區段。將具體例外放在範圍規則之前,確認清單末尾只保留一條 FINAL,然後儲存。 -
重新建立請求
確認已選用修改後的設定,重新建立連線,再次開啟實際測試頁面。長連線可能會繼續使用原有工作階段;若頁面仍沿用舊連線,請勿只靠重新整理就下結論。
-
檢查記錄
查看這次請求的連線記錄,確認目標網域或 IP、命中的規則及處理策略。若路徑錯誤,就調整規則順序;若路徑正確但存取失敗,再檢查連線本身與目標服務。
測試至少涵蓋三種目標:一個應符合具體例外的網域、一個應符合範圍規則的網域,以及一個應交由 FINAL 處理的目標。請使用你實際有權存取、且知道預期路徑的目標;本文中的 example.com 系列名稱僅用於說明語法,不代表連線測試結果。
驗收:一併確認網域、規則與策略
網頁能開啟,只能證明這次存取成功,不能證明命中了預期規則。請記錄「實際目標 → 命中規則 → 處理策略」三項,確認三者一致後再擴大修改範圍。
常見問題:規則沒有生效時,先檢查哪些地方
已新增 DIRECT,為什麼還是走 PROXY?
先確認 Home → Global Routing 是否設為 Config,再檢查 Config 中實際選用的檔案。接著查看 DIRECT 前方是否有涵蓋相同網域的 DOMAIN-SUFFIX、其他範圍規則,或提前出現的 FINAL。將具體例外移到第一條會涵蓋它的範圍規則之前,再重新建立請求驗證。
FINAL 放在最上面,會先檢查完下方規則嗎?
不會。請求比對到 FINAL 時,就會採用兜底策略,不會先往下搜尋再返回。請進入設定中的 [Rule] 區段,將 FINAL 移到規則清單末尾,並刪除重複的 FINAL;儲存後再次確認目前選用的是修改過的檔案。
已符合 PROXY,為什麼頁面還是打不開?
命中記錄只表示路由決策已完成。保持規則不變,檢查 Home 中選用的連線是否可用,再以相同目標進行對照。若連線、驗證或目標服務發生問題,應處理相應故障;不斷新增相同的 DOMAIN 規則無法修復這些問題。
更新後規則又恢復原樣,該如何保存修改?
確認更新的是 Home 中的訂閱,還是 Config 中的遠端設定檔。若遠端設定檔更新覆蓋了本機編輯內容,請還原備份,將自訂規則合併至獨立的本機副本並選用該檔案。之後更新時先比較差異,再手動合併,不要直接覆蓋唯一可用的副本。
如果記錄中的目標與預期網域不同,請先確認頁面跳轉、資源網域,以及這次連線實際使用的位址。單一頁面通常會建立多筆請求;替入口網域新增 DIRECT,不代表頁面引用的所有資源都會符合同一條規則。依記錄逐項確認,比不斷擴大 DOMAIN-SUFFIX 範圍更容易控制影響。
- 儲存前:確認規則語法、所屬區段、例外位置,以及 FINAL 是否只出現一次。
- 測試前:確認選用的檔案、Config 模式及所選連線,避免同時變更多個條件。
- 驗收後:保留可正常運作的副本,再新增規則;若發生異常,還原至上一份已驗證的設定。