JS 覆写脚本:hosts / DNS 处理流程

本页说明 Mihomo JS 覆写脚本 script_override.js 在三种订阅输入状态下处理 hosts 与节点 DNS 的步骤。

核心原则:hosts 决定要解析哪个名字;节点 DNS 优先级决定这个名字从哪里取得地址。

情形一:只有 hosts 真假映射

订阅未提供私有 DoH;节点原始 server 使用 hosts 左侧的假域名。

  1. 检查生效条件

    需满足 use-hosts=true,且 dns.listen 与节点解析入口在对应端口形成回环。

  2. 命中 hosts 映射

    节点 server 从左侧假域名改写为右侧真域名。

  3. 确认最终目标仍是域名

    改写后的 server 仍需继续进行 DNS 解析。

  4. 使用模板全局解析器

    订阅没有私有 DoH,因此节点域名由模板全局 proxy-server-nameserver 解析。

情形二:只有私有 DoH

订阅未使用 hosts 映射;节点原始 server 是真实域名。

  1. 选择节点解析来源

    按以下顺序取值,优先级从高到低:

    1. proxy-server-nameserver-policy
    2. proxy-server-nameserver(仅私有)
    3. nameserver-policy
    4. nameserver(仅私有)
  2. 写入最终节点 policy

    脚本把选出的私有解析来源整理到 dns.proxy-server-nameserver-policy。

  3. 解析节点域名

    需要私有解析的节点域名由对应的私有 DoH 解析。

  4. 保留全局兜底

    没有命中 policy 的域名仍由模板全局 proxy-server-nameserver 解析。

情形三:hosts 与私有 DoH 同时存在

订阅同时包含假域名映射和私有 DoH;先确定最终域名,再迁移适用的解析策略。

  1. 先改写节点名称

    hosts 命中后,将节点 server 改写成最终要连接的域名。

  2. 确定 policy 覆盖范围

    只有改写后最终仍是域名的节点,才需要相应的 DNS policy。

  3. 迁移私有解析来源

    按节点 DNS 优先级,将订阅中的私有来源关联到最终域名:

    1. 节点专用 policy
    2. 节点专用 DNS
    3. 普通 policy
    4. 普通 DNS
  4. 保留模板全局兜底

    模板全局 proxy-server-nameserver 始终保留,用于没有命中 policy 的域名。