port 写成 "443" 带引号有问题吗?为什么校验器要提醒
端口在 YAML 里写成 port:443 是数字,写成带引号的 "443" 就成了字符串。多数客户端能容忍这个差别,但部分版本会解析失败,报出与端口毫无关系的错误。本文说明两者的区别、什么时候真的会坏,以及端口越界时的报错含义。
一句话结论:port: 443 是数字,port: "443" 是字符串,YAML 层面这是两种不同的值。多数客户端会帮你转换,但不是所有版本都会——所以校验器建议你写不带引号的那种。
这条提醒不是「你错了」,而是「这里有一个不必要的风险」。
报错长什么样
配置校验器遇到带引号的端口时会提示:
写成
port: 443(不要引号)。多数客户端能容忍,但部分版本会解析失败。
而端口值本身超出范围时,是另一条更硬的报错:
port必须是 1–65535 的整数。
第二条没有商量余地——那是协议层面的约束,任何客户端都不会接受 port: 70000。
为什么 YAML 会区分这两种写法
YAML 会根据字面量的形状推断类型:443 推断成整数,"443" 因为有引号,明确地保持为字符串。这个机制平时很方便,偶尔会咬人。
对于端口,客户端拿到字符串时通常会做一次隐式转换,所以看起来没事。问题出在转换发生在哪一层:有的实现在解析配置时就转,有的推迟到建立连接时才转,还有的严格按 schema 校验、发现类型不符直接拒绝加载。最后那种情况给出的错误信息往往和端口无关,比如「配置格式错误」或者指向文件的其他位置,非常难排查。
什么时候真的会坏
端口带引号并且带了空格,比如 port: " 443"。这时候即便客户端愿意转换,多余的空格也可能让转换失败。
从别的格式转过来的配置。 手动把一条 vmess:// 链接改写成 YAML 时最容易出现——链接里的 JSON 中端口本来就是字符串("port":"443"),照抄过来就带上了引号。这一点在节点链接解析器的参数表里能直接看到:它会把链接里的端口原样显示出来,你能确认它在源数据里是什么形状。
订阅生成器的模板问题。 少数机场生成的 Clash 配置会给所有值统一加引号,这种配置在多数客户端上能用,换一个客户端就可能不行。
怎么改
去掉引号:
proxies:
- name: "香港 01"
type: vmess
server: example.com
port: 443 # 数字,不要写成 "443"
uuid: 8f3a1b2c-4d5e-6f70-8192-a3b4c5d6e7f8
注意只有端口需要这样,name、server、uuid 这些本来就是字符串,加不加引号都行。含有特殊字符(冒号、逗号、#)的字符串反而应该加引号,否则 YAML 会把它们当成语法。
改完把整份配置粘进配置校验器确认一遍。
顺带说一个相关的坑
同样的类型推断问题也会出现在其他字段上。最典型的是 alterId:写成 alterId: "0" 时,某些做严格校验的内核会认为它不等于数字 0,从而触发「必须为 0」的检查失败。
相关
相关文章
Clash 报错「proxies 必须是数组」是什么意思,怎么改
Clash 或 mihomo 提示 proxies 不是数组、无法解析节点列表时,问题几乎都出在 YAML 的短横线和缩进上。本文说明这个报错的确切含义、四种常见成因,以及每种情况的正确写法。
YAML 缩进明明对齐了却报错?多半是 Tab 混进来了
Clash 配置提示缩进不一致、mapping items 未对齐,但肉眼看每一行都对得整整齐齐——这种情况几乎都是 Tab 和空格混用。本文说明 YAML 为什么禁止 Tab 缩进、怎么在编辑器里揪出它,以及另外两种视觉上看不出的缩进问题。
报「配置最外层不对」——多半是你只粘了一段
校验器提示「配置最外层应该是 proxies / proxy-groups / rules 这样的键,而不是数组或纯文本」,通常不是配置坏了,而是你粘进来的只是整份配置里的一小段。本文说明 Clash 配置的顶层结构长什么样,以及三种典型的粘错情况。