設定實務 · Clash 技術部落格

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

主頁面能開卻有部分內容失敗,在 Connections 找到網域與命中規則。調整具體規則、順序或 Profile 覆寫,驗證訂閱更新後仍生效;持續更新的大名單用 rule-providers 管理。

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

頁面能開啟,圖片或登入卻失敗時,要找到失敗請求的實際網域,別只替網址列的網址加規則。要讓修改生效,還得看規則的位置、使用的策略是否存在,以及訂閱更新是否會覆蓋它。少量自訂規則可以直接寫,需要持續更新的大型清單再用規則集管理。

網站只有部分內容失敗,規則應匹配哪個網域?

一個頁面可能分別請求主網域、登入網域、圖片 CDN 和 API。規則匹配的是實際連線中的網域、IP 或處理程序,位址欄中的網址不一定包含失敗的資源。

保持 Rule 模式,在 Connections 找到剛才失敗的請求;需要代理時,固定一個確認可用的節點。比較目前策略與預期策略,只修改這個請求需要的規則,再重新發起請求。預期直連時不需要選擇代理節點。

修改規則需要的連線資訊

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

規則順序:具體條件放在寬規則之前

Mihomo 從上到下檢查規則,命中第一條就停止。具體條件通常位於更寬規則之前。

以下使用 api.example.com 說明規則順序,這個佔位網域不能用於驗證實際業務。套用到既有 Profile 時,換成 Connections 記錄的真實網域,並使用該設定已有的目標群組;群組名稱引用必須完全一致,需要代理時才在群組內選中可用節點。預期直連時才使用 DIRECT。

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

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

套用到自己的設定後,儲存並重新載入,關閉修改前的舊連線,再重新請求實際目標。在 Connections 核對真實網域、新命中規則與最終出口;仍是舊結果時,檢查連線重用,以及目前 Profile 是否載入本次修改。

在 Clash Verge Rev 新增規則,再檢查更新後是否保留

直接修改遠端訂閱檔案,下次更新可能覆蓋修改。要保留自訂規則,可使用用戶端的規則覆寫功能,在載入訂閱時加入自己的規則。

以下步驟以 Clash Verge Rev 為例:以右鍵點選目前訂閱卡片,進入「編輯規則」。新增規則放在「前置規則」,位於訂閱原有的寬泛規則與 MATCH 之前;其他用戶端依自己的文件操作。

讓自訂規則立即生效,且訂閱更新後仍保留

  1. 記錄實際請求與目標

    在 Connections 取得失敗請求的網域和目前命中規則,確認希望直連還是使用既有策略群組。

  2. 確認目標策略可用

    使用目前 Profile 已有的群組名稱;需要代理時在群組內選中可用節點,不能只看到群組名稱就認定已經走代理。

  3. 新增一條前置規則

    在 Clash Verge Rev 中右鍵點擊目前訂閱,開啟「編輯規則」並新增一項。按完整網域匹配時,類型選 DOMAIN,填入 Connections 記錄的網域,策略選既有群組或 DIRECT,位置選「前置規則」。其他用戶端依自身文件操作,不覆蓋遠端訂閱快取。

  4. 重新載入並發起新請求

    關閉修改前的舊連線,再重做同一動作,查看新命中規則與最終出口,檢查原本失敗的資源是否恢復。

  5. 更新訂閱後再檢查一次

    手動更新目前訂閱,重新請求並核對同一規則、實際出口與網頁結果;失敗時停用本次新增覆寫,保留可用的原設定。

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

舊教學的 prepend-rules 與目前規則編輯入口

早期教學可能用 prepend-rules 表示在訂閱規則之前加入自己的規則。下方只用於辨認這種寫法;目前入口與欄位限制請看提示。

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

需要持續更新的名單時,再用 rule-providers

只有幾條自訂規則時,先透過目前用戶端支援的覆寫儲存,並檢查訂閱更新後仍有效。需要專案持續維護的大型名單時,再用 rule-providers 儲存規則資料、用 RULE-SET 引用;匹配後使用哪個策略,仍由 rules 中的目標決定。

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 與 format:名單內容、格式及組合限制

rule-provider 的 behavior

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

behavior 決定名單內容,format 決定檔案格式。yaml、text 和 mrs 不能任意組合:mrs 只支援 domain、ipcidr,不支援 classical。先核對規則來源公布的 behavior、format 與實際內容;檔案下載成功,不代表組合正確或已經載入。

不要依 URL 後綴猜格式。規則來源改變格式後,用戶端仍可能保留舊快取;依日誌中的 provider 名稱與解析錯誤,確認正在載入哪份內容。

規則集下載失敗:位址、間隔、代理與快取

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

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

規則不生效:下載、格式、引用名與順序

provider download 401 / 403 / 404

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

provider parse error

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

RULE-SET not found

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

proxy group not found

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

規則載入但總命中前一條

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

訂閱更新後自訂項消失

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

新增規則後,檢查同頁其他連線

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

保留新增規則的網域、匹配條件和目標組記錄,便於節點或 Profile 改名後檢查引用。

參考資料