外观
FlClash 脚本分流配置教程
约 3426 字大约 11 分钟
FlClash脚本覆写分流规则DNS
2026-10-11
按照本站入门教程完成 FlClash 配置、能够正常上网后,在规则模式下,通常已经按机场订阅自带的规则进行分流。这套配置可以满足大部分日常使用场景,没有特殊需求就不必额外修改。
本文的分流脚本,主要让你给不同网站分别指定节点,而不是所有代理网站都跟着同一个节点切换。用的仍是你现有订阅里的节点,不需要再买一份订阅。例如:
- ChatGPT、Claude 用节点 A:选择一个已经确认能访问这些服务的节点。
- YouTube 用节点 B:选择一个观看视频体验合适的节点,不影响 AI 的节点选择。
- GitHub 跟随默认节点 C:以后只需在“[本站]默认”里换节点,跟随默认的服务组也会一起改变;单独选了节点的 AI、YouTube 则不受影响。
设置后,FlClash 根据脚本列出的域名把请求送到对应分组,再使用你在组里选的节点。其他网站仍按机场原有规则处理,该直连还是走哪个代理组,由原配置决定。
脚本不会让节点自动变快,也不能保证解锁服务;它只改变指定域名的流量去向,不修改 DNS、TUN 或端口。机场配置如果已经有你需要的分组,可以直接使用;想自己增删网站、决定它们走哪个节点时,再按下面的教程设置。
下面按电脑端的操作顺序完成配置:复制并保存脚本 → 绑定订阅 → 选择节点 → 验证分流,DNS 按需检查。不同版本的菜单名称和图标可能略有差异。
准备好可用订阅
尚未安装或导入订阅,先看本站的FlClash 电脑端入门教程或FlClash 安卓入门教程。客户端来源可核对FlClash 项目说明。
开始前确认两件事:
- 当前订阅能够正常联网。脚本只处理配置,不提供节点,也不能修复失效节点。
- 已备份当前配置和自定义覆写。本脚本只新增服务组和域名规则,不修改 DNS、TUN、端口、IPv6 或节点信息。
第一步复制并保存脚本
- 点击左侧的扳手图标(工具),进入 进阶配置 → 脚本。
- 在脚本列表点击 添加,打开“未命名”编辑页。
- 点击下方代码块右上角的复制按钮。回到 FlClash,先点击代码编辑区,再按 Ctrl+A → Ctrl+V,用完整代码替换示例代码,不要把两份代码拼在一起。
- 点击右上角的保存图标,将名称填写为“我的分流”,写名称后点 确定。
- 返回脚本列表,确认出现“我的分流”,选中后再进行下一步。

// mahu.blog 分流脚本 v1.0:只增加服务分组与域名规则,不修改 DNS、TUN 或端口。
function main(config) {
// 可编辑区:在这里增删分组和域名,只写域名,不写网址或通配符。
const prefix = "[本站]";
const services = {
AI: ["chatgpt.com", "openai.com", "oaistatic.com", "oaiusercontent.com", "claude.ai", "anthropic.com"],
YouTube: ["youtube.com", "youtu.be", "googlevideo.com", "ytimg.com"],
GitHub: ["github.com", "githubusercontent.com", "githubassets.com"],
};
if (!config || typeof config !== "object" || Array.isArray(config)) {
throw new Error("没有读取到有效订阅配置");
}
if (!Array.isArray(config.rules) || config.rules.length === 0) {
throw new Error("订阅没有基础规则,请先使用能够正常上网的完整配置");
}
if (config.proxies !== undefined && !Array.isArray(config.proxies)) {
throw new Error("订阅的 proxies 格式不正确");
}
if (config["proxy-groups"] !== undefined && !Array.isArray(config["proxy-groups"])) {
throw new Error("订阅的 proxy-groups 格式不正确");
}
const providers = config["proxy-providers"] || {};
if (typeof providers !== "object" || Array.isArray(providers)) {
throw new Error("订阅的 proxy-providers 格式不正确");
}
const nodes = config.proxies || [];
const oldGroups = config["proxy-groups"] || [];
const reserved = new Set(["DIRECT", "REJECT", "REJECT-DROP", "PASS", "COMPATIBLE", "GLOBAL"]);
const nodeNames = [...new Set(nodes
.filter(node => node && typeof node.name === "string" && node.name.trim()
&& !reserved.has(node.name) && !["direct", "reject", "pass"].includes(node.type))
.map(node => node.name))];
const providerNames = Object.keys(providers);
if (nodeNames.length === 0 && providerNames.length === 0) {
throw new Error("订阅没有可用节点或节点集合");
}
const defaultName = prefix + "默认";
const serviceNames = Object.keys(services);
const names = [defaultName, ...serviceNames.map(name => prefix + name)];
const existing = new Set([...nodes, ...oldGroups].map(item => item && item.name));
for (const name of names) {
if (!name.trim() || /[,\r\n]/.test(name) || reserved.has(name)) {
throw new Error("分组名称不能为空或包含逗号、换行");
}
if (existing.has(name)) {
throw new Error("配置已有同名分组或节点:" + name + "。请更换 prefix,或从原订阅重新加载");
}
}
if (new Set(names).size !== names.length) {
throw new Error("服务分组不能与默认分组重名");
}
const routes = [];
const domains = new Set();
for (const service of serviceNames) {
if (!Array.isArray(services[service]) || services[service].length === 0) {
throw new Error("分组必须包含域名:" + service);
}
for (const value of services[service]) {
const domain = typeof value === "string" ? value.trim().toLowerCase() : "";
if (!/^(?:[a-z0-9-]+\.)+[a-z0-9-]+$/.test(domain)) {
throw new Error("请只填写域名,不填写网址、路径或通配符:" + value);
}
if (domains.has(domain)) throw new Error("域名重复,请只保留一个分组:" + domain);
domains.add(domain);
routes.push({ domain, target: prefix + service });
}
}
// 更具体的子域名先匹配,方便给某个服务单独指定策略。
routes.sort((a, b) => b.domain.split(".").length - a.domain.split(".").length);
const makeGroup = (name, choices) => {
const group = { name, type: "select", proxies: choices, "empty-fallback": "REJECT" };
if (providerNames.length) group.use = providerNames.slice();
return group;
};
const groups = [makeGroup(defaultName, nodeNames.slice()),
...serviceNames.map(name => makeGroup(prefix + name, [defaultName, ...nodeNames]))];
// 只替换这两份数组;机场节点、基础规则及其他设置均保留。
return { ...config,
"proxy-groups": [...groups, ...oldGroups],
rules: [...routes.map(route => "DOMAIN-SUFFIX," + route.domain + "," + route.target), ...config.rules]
};
}保存脚本不等于启用脚本,还需要绑定订阅。
第二步绑定到你的订阅
- 点击左侧的文件夹图标(配置),找到正在使用的订阅卡片。
- 点击这张卡片右侧的 ⋮ 三点菜单 → 更多 → 覆写。
- 在 覆写模式 中点击 脚本 按钮。
- 在 覆写脚本 下点击“我的分流”这一行,确认名称左侧的圆形选项已选中。下方的“前往配置脚本”用于编辑脚本,不是启用按钮。
- 点击左上角的返回箭头退出覆写页,让配置应用。确认这份订阅仍是当前选中的配置,再点击左侧 代理,刷新一下,检查是否出现
[本站]分组。

右上角的 预览 只用于查看生成的配置,不代替选中脚本和返回应用。若分组尚未刷新,回到 仪表盘,用当前的启动/停止按钮停止后重新启动,再检查;无需删除订阅。
正常加载后,应能看到脚本生成的代理组。脚本会增加 [本站]默认、[本站]AI、[本站]YouTube、[本站]GitHub 四个分组。列出的域名优先按本站规则分流,其他请求继续按机场原有规则处理;域名后缀匹配也会覆盖其子域名。原理见mihomo 路由规则说明。
脚本只是一份精简域名列表,不保证覆盖每项服务的所有登录、接口或资源域名;遗漏的请求仍可能命中机场规则,可根据连接记录补充。
第三步设置代理组
- 点击左侧 仪表盘,在 出站模式 中选择 规则,不要使用“全局”或“直连”来验证脚本分流。
- 点击左侧 代理,再点击页面顶部的 [本站]默认 标签。
- 点击下方一个能够正常访问网站的实际节点卡片。卡片选中后会高亮,表示默认组使用这个节点。
- 依次点击顶部的 [本站]AI、[本站]YouTube、[本站]GitHub 标签,在每个分组里选择节点;想共用默认节点,就点击该组中的 [本站]默认 卡片。
各组的设置用途如下:
| 分组 | 怎么设置 |
|---|---|
| [本站]默认 | 先选一个确认能用的节点,作为本站服务组的共同默认选择 |
| [本站]AI | 选择能够访问目标 AI 服务的节点,也可以沿用本站默认 |
| [本站]YouTube | 选择视频访问稳定的节点 |
| [本站]GitHub | 选择能正常访问及下载的节点 |

不要选择“剩余流量”“距离下次重置”“套餐到期”这类信息卡片,它们不是正常的线路。截图中的 Timeout 表示该项延迟测试超时,绿色毫秒数是一次延迟结果,不代表带宽或长期稳定性;最终仍要用目标网站验证。
服务组可以选择具体节点,也可以选择 [本站]默认,跟随它的节点选择。脚本保留原来的机场代理组,但不会自动把节点按地区分类;含 proxy-providers 的订阅通过节点集合提供可选节点。配置项含义见mihomo 代理组说明。
系统代理和 TUN 决定哪些请求进入客户端,规则模式决定进入后的请求怎么走。不要为了分流同时乱改这些开关;需要开启 TUN 时,确认没有与其他 VPN 冲突,具体限制可查mihomo TUN 说明。
添加自己的分组
想给另一个网站单独选节点,只需编辑脚本开头的 services。例如在最后一项后面添加:
Google: ["google.com"],把这一行放在 GitHub 项后面、services 的结束括号前面,保留上一项末尾的逗号。修改后点击右上角的保存图标。

保存并重新加载配置(刷新一下订阅),就会多出 [本站]Google 分组。填写域名即可,不加协议、路径或通配符;同一域名只能属于一个分组。更具体的子域名会优先匹配,例如单独配置 gemini.google.com 时,它会排在 google.com 前面。
第四步确认分流是否生效
以 GitHub 为例:
- 在浏览器里新打开 GitHub 页面。
- 回到 FlClash,点击左侧的 连接,不是“请求”。
- 点击右上角的放大镜图标,输入
github筛选相关连接。除了github.com,也可能看到avatars.githubusercontent.com等资源域名。 - 查看对应连接下面的标签:是否包含 [本站]GitHub,以及最终是否使用了第三步选择的节点。若选择了共用默认节点,还会看到 [本站]默认。

图中 GitHub 连接带有 [本站]GitHub → [本站]默认 → 节点 这条策略关系,而 YouTube 连接走 [本站]YouTube → 节点,说明这两类请求分别进入了对应服务组。右侧的圆圈斜杠按钮是关闭该连接,不是切换节点;选择节点应回到“代理”页面。
再用同样的方法检查 AI 或 YouTube。服务可能使用多个域名,应查看实际请求,不是只看一个首页。切换策略后重新发起请求,旧连接可能仍使用之前的节点。
如果完全没有连接记录,先检查应用是否进入代理;如果有记录却走了 DIRECT 或其他组,检查规则命中。详细解释见本站Clash 日志与连接排查。
第五步按需检查 DNS
本脚本不修改 DNS,也不包含“防泄露一键修复”。需要检查时,打开BrowserLeaks DNS 检测,比较启用脚本前后的解析服务器,查看是否符合自己的 DNS 设置。
如果出现不预期的本地运营商解析器,继续检查 TUN、浏览器安全 DNS 和系统 DNS。不能只凭国旗判断是否泄露,也不能把一次浏览器测试当作所有应用的安全保证。
DoH 表示 DNS 使用加密传输,不等于查询一定经过代理;具体解析策略可查mihomo DNS 文档。检测时不需要提交订阅链接或私人配置。
出错时按这个顺序恢复
- 提示语法错误:确认复制了完整代码,没有连同 Markdown 的代码围栏一起粘贴。
- 没有出现代理组:检查脚本是否保存、是否绑定当前订阅,以及配置错误提示。
- 提示同名或重复域名:给
prefix换一个前缀,或只保留该域名的一处分组设置。不要在已处理的配置上重复套用脚本。 - 有代理组但打不开网页:先用原订阅确认节点可用,再检查规则和 DNS。
- 启用后整个网络异常:停止连接,解除该订阅的脚本覆写,恢复备份和原来的代理开关,再测试。
不要通过关闭证书校验、清空全部配置或关闭防火墙来处理这类问题。
设置完成后保存一份可用版本。这里粘贴的是本地脚本,不会自动从网站更新;以后修改脚本或更新订阅,都重新检查一次分流结果。

