基本规则
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