基本規則
YAML 大小寫敏感,用縮排表示層級關係。縮排只能用空格,不能用 Tab;具體縮排幾個空格不重要,只要同一層級的元素左對齊即可。
如果編輯器裡出現「縮排對不齊但看起來是對的」的報錯,十有八九是不小心混入了 Tab 字元,檢查一下縮排方式。
註解
用 # 開頭到行尾都是註解。# 前面必須是行首或者有空格,否則不會被當作註解(比如寫在 URL 裡的 # 就不受影響)。
port: 7890 # http 代理埠 socks-port: 7891 # socks 代理埠
物件與陣列
物件用key: value表示,冒號後面要加一個空格。因為 YAML 是 JSON 的超集,所以也可以直接寫 JSON 風格的語法,四種寫法完全等價:
tun: enable: true stack: system auto-route: true auto-detect-interface: true
tun: { enable: true, stack: system, auto-route: true, auto-detect-interface: true }
陣列用 - 開頭的行表示,一樣支援單行 JSON 寫法 a: [b, c, d],跟多行陣列等價:
a: - b - c - d
錨點與引用
& 用來給一段設定打上錨點,* 用來引用這個錨點,<< 表示把錨點內容合併到目前物件裡。寫多個代理集合、多個規則集合時,公共欄位可以只寫一次,用錨點複用,省掉大量重複程式碼。
p: &p type: http interval: 3600 health-check: enable: true url: https://www.gstatic.com/generate_204 interval: 300 proxy-providers: provider1: <<: *p url: "" path: ./proxy_providers/provider1.yaml provider2: <<: *p type: file path: ./proxy_providers/provider2.yaml
上面這段等價於把 p 錨點的內容分別複製進 provider1 和 provider2 裡。注意如果合併時出現重複欄位(比如 provider2 裡重新寫了 type),以自己寫的為準,不會被錨點覆蓋。另外 p 這個鍵名本身在 mihomo 裡並不是一個合法欄位,只是用來存放錨點,解析時會被忽略。
網域萬用字元
這裡說的萬用字元,專門用在 fake-ip-filter、nameserver-policy 等欄位裡,和路由規則裡的 DOMAIN-WILDCARD 不是一回事,兩者語法不通用。
| 萬用字元 | 匹配範圍 | 範例 |
|---|---|---|
* | 只匹配一級網域 | *.baidu.com 匹配 tieba.baidu.com,不匹配 123.tieba.baidu.com 或 baidu.com |
+ | 匹配任意多級(前綴寫法,類似 DOMAIN-SUFFIX) | +.baidu.com 同時匹配 baidu.com、tieba.baidu.com、123.tieba.baidu.com |
. | 匹配任意多級,但不含裸網域本身 | .baidu.com 匹配 tieba.baidu.com,不匹配 baidu.com |
使用萬用字元時建議用引號包裹,避免被 YAML 解析成其他類型:
fake-ip-filter: - ".lan" - "xbox.*.microsoft.com" - "+.xboxlive.com" - localhost.ptlogin2.qq.com
引入網域集合
部分欄位(如 fake-ip-filter)支援直接引入 rule-set 或 geosite 集合,寫法為 類型:集合名:
這裡的 rule-set 僅支援 behavior 為 domain / classical 的規則集合。
fake-ip-filter: - "rule-set:xxx" - "geosite:xxx"
埠範圍
用 - 表示一個埠範圍,用 / 或 , 分隔多個埠 / 埠範圍,可以混合書寫:
# 匹配 114-514、810-1919 兩個區間,以及單獨的 65530 埠 114-514/810-1919,65530