一般机场下载下来的配置都自带很多的规则,但是有时自己需要针对特定的域名和 IP 进行优化。Clash for Windows 的 Mixin 功能,以及 Clash Verge 的全局扩展配置和全局扩展脚本,让我们能在不修改原始配置文件情况下,自由定制配置的能力。
我的 Clash 在规则模式下:
如此种种,虽然下载的配置文件中为我设定了详细的规则。但我总希望我能自己定义一些规则,由于就有了这篇文章。
可以直接修改对应机场的配置文件中的 rules
rules: - DOMAIN-SUFFIX,cn.bing.com,DIRECT - DOMAIN-SUFFIX,zhuanlan.zhihu.com,DIRECT - DOMAIN-SUFFIX,zerolacqua.top,DIRECT - DOMAIN-SUFFIX,docs.opencv.org,DIRECT
对我来说 DOMAIN-SUFFIX
就够用了,这样就能完成自定义规则。
但是这么做有一个问题,修改的规则是在配置文件中的,哪天你更新了配置文件(代理的配置文件一般都会经常更新),你的自定义规则就没有了。那如何避免直接在代理的配置文件中进行修改呢?
Clash for Windows 的 Mixin (yml) 模式,以及 Clash Verge 的全局扩展配置(yml),能在不配置原配置文件的基础上,通过编写额外的规则覆盖原有的规则。不管你切换到了哪个代理的配置,这个规则都能适用。
下面以 mixin 为例:
yamlmixin:
rules:
- "DOMAIN-SUFFIX,zerolacqua.top,DIRECT"
- "DOMAIN-SUFFIX,zhuanlan.zhihu.com,DIRECT"
这样,当访问 *.zerolacqua.top
或者 *.zhuanlan.zhihu.com
时,就会直接走 DIRECT
流量。
但是这样做还是有问题,那就是 yml 中定义的 rules
字段将把原配置文件中 rules
覆盖掉。导致代理配置中定义的那么多规则全部没了。当然,你可以选择把代理配置中的规则复制进 yml 中,不过这肯定不是期望的方法。
Clash for Windows
Diff 模式可以让我们既做到增量式地添加规则,不过针对每个配置文件,Diff 都是独立的,如果有多个配置文件,那么你就要定义多次 Diff。
diffrules:
+ - DOMAIN-SUFFIX,cn.bing.com,DIRECT
+ - DOMAIN-SUFFIX,zhuanlan.zhihu.com,DIRECT
- DOMAIN-SUFFIX,bilibili.com,🌏 爱奇艺&哔哩哔哩
比如你在 Diff 中添加了如上的两行,那么每次更新配置后,你所做的修改都会应用在这个配置文件上。
Clash Verge
编辑规则、编辑代理组提供了可视化 UI,可以添加、删除规则(或代理组),编辑结果不会修改配置文件,效果与 Clash for Windows 的 Diff 类似。
Diff 模式/编辑规则似乎已经帮助我们解决了问题,但有一点遗憾的地方是,每个代理配置文件都需要单独进行配置。有没有更好的办法,让我“一处配置、处处生效”?
Clash for Windows
Mixin 除了 yml 格式,还有 js 格式的(需要在设置中打开)。在 js 格式中,Clash 给出了默认的配置:
jsmodule.exports.parse = ({ content, name, url }, { yaml, axios, notify }) => {
return content
}
修改:
jsmodule.exports.parse = ({ content, name, url }, { yaml, axios, notify }) => {
const extra = {
rules: [
'DOMAIN-SUFFIX,cn.bing.com,DIRECT',
'DOMAIN-SUFFIX,zhuanlan.zhihu.com,DIRECT',
...content.rules,
],
}
return { ...content, ...extra }
}
这里 content
是配置文件的结构化数据,将 rule
属性进行修改,添加上需要的内容即可。
Clash Verge
按官网提供的方法设置规则:
js/**
* 配置中的规则"config.rules"是一个数组,通过新旧数组合并来添加
* @param prependRule 添加的数组
*/
const prependRule = [
// 将百度分流到直连
'DOMAIN-SUFFIX,cn.bing.com,DIRECT',
'DOMAIN-SUFFIX,zhuanlan.zhihu.com,DIRECT',
];
function main(config) {
// 把旧规则合并到新规则后面(也可以用其它合并数组的办法)
let oldrules = config["rules"];
config["rules"] = prependRule.concat(oldrules);
return config;
}
参见:https://www.clashverge.dev/guide/rules.html?h=%E5%85%A8#_4
本文作者:Zerol Acqua
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!