一次查询失败并不能证明目标位于私有网络之外,它只证明这次 PAC 求值没有拿到所需的地址。

当 dnsResolve() 为 isInNet() 规则提供输入时,这一区别很重要。Chromium 的 PAC 实现在解析失败时返回 null。不要依据「结果总是空字符串」这一印象来构造失败分支。

function FindProxyForURL(url, host) {
    var address = dnsResolve(host);
    if (!address) {
        return "PROXY proxy.example:8080";
    }
    if (isInNet(address, "10.40.0.0", "255.255.0.0")) {
        return "DIRECT";
    }
    return "PROXY proxy.example:8080";
}

这个示例把未解析的名称交给代理。这是一种策略选择,而不是普适的安全默认值。当代理拥有客户端所没有的解析器或网络视角时,它可能有用。要求本地解析的网络则需要另一种明确的结果。

只解析一次并复用结果。这样决策就绑定在单一取值上,也避免重复可能很慢的辅助调用。

还要检查真正的 PAC 使用方。旧的 IPv4 辅助函数与扩展的 IPv6 辅助函数契约不同。用一个浏览器实现验证过的规则,并不能证明所有使用同一 PAC URL 的应用都支持它。

如果需求只是把已知的公司后缀走特定路由,主机名规则可以完全避开查询。只有当地址确实是策略所需的信息时,才采用基于地址的分类。

相关文章