处理 PAC 规则内的 DNS 失败
为失败的 PAC DNS 查询单独设置一条策略分支,而不是把它当作本地网络之外已核实的地址。
一次查询失败并不能证明目标位于私有网络之外,它只证明这次 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 的应用都支持它。
如果需求只是把已知的公司后缀走特定路由,主机名规则可以完全避开查询。只有当地址确实是策略所需的信息时,才采用基于地址的分类。