設定實務 · Clash 技術部落格

Clash 規則怎麼寫?rule-providers、覆寫與訂閱更新不丟設定

不要從一份很長的網路上的規則開始。先在 Connections 找到真正走錯的請求,寫一條能解釋的本機規則;規則變多後再拆成 rule-providers 和覆寫。

  • rule-providers
  • mixin
  • YAML
本文目錄

規則從一條真正走錯的連線開始

規則不是按網站首頁標題匹配,而是按實際連線中的網域、IP、處理程式等資訊匹配。一個頁面可能同時請求主網域、登入網域、圖片 CDN 和 API;只憑位址欄寫一條規則,常常只修好頁面的一部分。

固定節點並保持 Rule 模式,重複失敗動作,到 Connections 記錄目標、目前命中的規則和出口。需要改的是「這條連線為什麼先命中這裡」,而不是把網路上的整份規則表塞進設定。

動手前留下四項

  • 失敗連線的完整網域或目標 IP
  • 目前顯示的規則類型與規則內容
  • 最終使用的策略群組或 DIRECT
  • 這條連線實際應該去的策略

Mihomo 從上往下匹配,命中第一條就停止

更具體的規則通常放在更寬的規則前面。下面把 api.example.com 交給示例中已經定義的「代理選擇」,並讓更寬的 example.com 規則保持 DIRECT;末尾的 MATCH 接住此前沒有匹配的連線。

自包含示例,具體規則放在寬規則之前
proxy-groups:
  - name: 代理选择
    type: select
    include-all: true
    proxies:
      - DIRECT

rules:
  - DOMAIN,api.example.com,代理选择
  - DOMAIN-SUFFIX,example.com,DIRECT
  - MATCH,代理选择

儲存並重載設定後,關閉舊頁面連線,再發起新請求。Connections 顯示 DOMAIN,api.example.com 和「代理選擇」,說明規則與順序同時生效;仍顯示上一條結果時,可能是連線重用或目前 Profile 沒有載入這份修改。

同一來源的長名單,才值得交給 rule-providers

只有幾條本機網域時,直接規則更容易讀。某個專案維護了幾十、幾百條網域或 IP,且需要定期更新,才用 rule-providers 把資料源與主設定分開。主 rules 中用 RULE-SET 引用 provider,並為整組指定策略。

provider 只是規則資料,不會自己選擇節點。示例中的「RULE-SET,work-domains,代理選擇」把匹配結果交給已經定義的「代理選擇」;如果換成自己的組名,proxy-groups 和 rules 兩處必須完全一致。

規則集最小結構,rules.example.com 是待替換位址
proxy-groups:
  - name: 代理选择
    type: select
    include-all: true
    proxies:
      - DIRECT

rule-providers:
  work-domains:
    type: http
    behavior: domain
    format: yaml
    url: https://rules.example.com/work.yaml
    path: ./ruleset/work.yaml
    interval: 86400

rules:
  - RULE-SET,work-domains,代理选择
  - MATCH,代理选择

behavior 要和檔案內容一致

rule-provider 的 behavior

檔案裡放什麼不適合放什麼
domain網域、網域後綴等網域集合IP 網段與完整經典規則行
ipcidrIPv4 / IPv6 CIDRDOMAIN、PROCESS-NAME 等條件
classical帶類型的完整規則,例如 DOMAIN-SUFFIX,...只想維護純網域時會顯得冗長

format 用來說明檔案編碼形式,常見有 yaml、text 和 mrs。behavior 和 format 是兩件事:一個說明規則語義,一個說明檔案怎麼儲存。把純網域文字聲明成 ipcidr,下載可能成功,載入仍會發生錯誤。

先查看規則源自己公佈的格式說明,不要根據 URL 後綴猜。源檔案改變格式時,用戶端快取的舊檔案也可能繼續存在,日誌中的 provider 名稱和解析錯誤能幫助確認。

規則集更新失敗,要看 url、interval、proxy 和 path

type
http 從遠端更新,file 讀取本機檔案,inline 把內容直接放在設定中。
url
遠端規則源位址;401、403、404 和 timeout 應按 HTTP 結果處理。
interval
更新間隔,單位為秒。過短只會增加請求,並不會讓規則更準確。
proxy
指定下載規則源時使用的代理;源站本機可達時也可以按設定直連。
path
快取檔案路徑。Mihomo 預設限制在 HomeDir,外部路徑需要 SAFE_PATHS。

provider 下載失敗時,舊快取可能仍被使用,所以「網站還能開啟」不代表今天更新成功。查看 provider 的本次更新時間與日誌,保留舊快取到新源恢復,不要直接刪掉所有規則檔案。

遠端訂閱會被覆蓋,自訂規則應放進覆寫

直接編輯下載到 Profiles 目錄的遠端 YAML,當下可能有效,下一次訂閱重新整理會把它替換。Clash Verge Rev 等用戶端提供合併、指令碼或規則覆寫能力,用來在遠端設定載入時插入本機內容;具體入口隨版本不同,應使用目前用戶端的 Profile 覆寫頁面。

一條需要優先執行的自訂規則,應透過 prepend 或等效的前置合併放到訂閱寬規則之前。只是把它追加到 MATCH 後面,檔案裡雖然能看到,執行階段永遠不會到達。

覆寫欄位示意,只使用內建 DIRECT 動作
prepend-rules:
  - DOMAIN,api.example.com,DIRECT
  - DOMAIN-SUFFIX,intranet.example,DIRECT

重載後看執行階段命中,不要只看編輯器裡有這行

驗證一條覆寫規則

  1. 儲存並啟用覆寫

    確認它綁定到正在使用的遠端 Profile。

  2. 重載設定

    日誌不應出現 rule、provider 或 proxy group 解析錯誤。

  3. 關閉舊連線

    避免瀏覽器重用修改前建立的會話。

  4. 重複目標動作

    在 Connections 讀取新規則和最終策略。

  5. 手動更新訂閱

    更新後再請求一次,確認覆寫沒有消失。

兩次請求都命中同一自訂規則,才證明「目前有效」和「更新後保留」同時成立。只在編輯器裡搜尋到文字,不能代表它已經進入 Mihomo 的執行設定。

規則不生效時,按下載、解析、引用、順序四層檢查

provider download 401 / 403 / 404

處理遠端位址、權限或已遷移路徑,規則語法還未參與。

provider parse error

核對 behavior、format 與源檔案實際內容。

RULE-SET not found

rules 引用名與 rule-providers 鍵名不一致。

proxy group not found

規則目標組在目前訂閱中不存在或已經改名。

規則載入但總命中前一條

調整順序,讓具體規則位於寬規則和 MATCH 之前。

訂閱更新後自訂項消失

停止直接改遠端檔案,改用綁定目前 Profile 的覆寫。

每條新增規則都要能解釋執行結果

規則越多,互相遮擋的機會越大。完成目標網域的驗證後,檢查同一頁面的其他連線是否仍按預期直連或代理;若只需要三條規則,就不必引入一個包含數萬條未知來源的清單。

收尾時用一句話說明執行結果:哪條連線命中了哪個條件,進入哪個策略群組,訂閱更新後仍然如此。解釋不了的規則暫時不加,日後節點和 Profile 改名時也更容易維護。

參考資料