規則的執行順序:命中即停止

Clash 的 rules 是一份從上到下順序執行的列表,每一條格式大致為 類型,匹配內容,策略。使用者端拿到一個網路請求後,從第一條規則開始逐條比對,一旦命中就立即套用對應策略,不再繼續往下匹配。這一點是理解規則檔案最關鍵的前提,很多「規則明明寫對了卻不生效」的問題都是因為忽略了這一點。

舉個例子,假設規則檔案裡有這四條:

- DOMAIN-SUFFIX,example.com,DIRECT
- DOMAIN-SUFFIX,google.com,PROXY
- GEOIP,CN,DIRECT
- MATCH,PROXY

一個存取 www.google.com 的請求會先檢查第一條——不匹配 example.com,跳過;檢查第二條——匹配 google.com 的子網域,命中,直接套用 PROXY 策略並停止,後面的 GEOIPMATCH 規則根本不會被執行到。

常用規則類型完整清單

除了教程頁快速查詢表裡最常用的六種,Clash 實際支援的規則類型更豐富,按用途整理如下:

Rule Provider:不用手寫、跟著遠端來源自動更新

逐條手寫規則顯然不現實——中國大陸網站幾千個網域不可能一條條列。rule-providers 的作用就是引用一份由社群或服務商維護、遠端託管的規則集合,規則內容會跟著遠端來源自動更新,你只需要在規則列表裡用一行引用它:

rule-providers:
  reject:
    type: http
    behavior: domain
    url: "https://example.com/rules/reject.txt"
    path: ./ruleset/reject.yaml
    interval: 86400

rules:
  - RULE-SET,reject,REJECT
  - GEOIP,CN,DIRECT
  - MATCH,PROXY

大多數訂閱服務商已經把這一層配置好了,一般使用者開箱即用;只有當預設規則集無法滿足你的需求(比如想額外攔截某個新出現的廣告網域)時,才需要在它的前面插入自己的規則——因為順序在前的規則優先命中。

新手最容易犯的三個規則錯誤

1. 把 MATCH 寫在中間而不是最後

MATCH 是兜底規則,一旦寫在列表中間,它後面的所有規則都不會再被執行到,因為 MATCH 本身匹配一切流量。永遠把它放在整個 rules 列表的最後一行。

2. 自訂規則寫在了 Rule Provider 引用的後面

如果你想讓自己寫的規則優先於訂閱自帶的規則集生效,必須把它放在 RULE-SET 引用行的前面,否則訂閱規則集會先命中,你的自訂規則永遠排不上號。

3. 忘記給 IP-CIDR 加 no-resolve

匹配內網 IP 段時,建議加上 no-resolve 參數(如 IP-CIDR,192.168.0.0/16,DIRECT,no-resolve),表示不對網域做提前解析,避免因為解析行為觸發不必要的 DNS 查詢。

實戰範例:給某個網域單獨指定策略

假設你想讓某個特定網站始終走代理,而不受訂閱規則集判斷影響,只需要在規則列表最前面加一行:

rules:
  - DOMAIN-SUFFIX,example.com,PROXY   # 自訂規則放最前面
  - RULE-SET,reject,REJECT
  - RULE-SET,direct,DIRECT
  - RULE-SET,proxy,PROXY
  - MATCH,PROXY

因為它排在所有 RULE-SET 引用之前,會最先被匹配到,不會被訂閱規則集「搶先」判定為直連或其他策略。

寫在最後

理解「順序匹配、命中即停」這一條核心邏輯,剩下的規則類型只是詞彙量的積累。不確定某個詞是什麼意思,可以隨時去術語表查一下;如果只是想知道某個網站為什麼打不開,使用教程的排查方法可能比手寫規則更快解決問題。