我们有一个 Proxy.pac 文件:
function FindProxyForURL(url, host) {
if (dnsResolve("ProxyServer") == "10.1.1.116")
if (dnsDomainLevels(host) == 0 ||
isInNet(host, "10.0.0.0","255.0.0.0") ||
isInNet(host, "125.0.0.0","255.0.0.0") ||
isInNet(host, "127.0.0.0","255.0.0.0") ||
isInNet(host, "204.223.70.250","255.255.255.255") ||
dnsDomainIs(host, ".muj.com") ||
dnsDomainIs(host, "sv.com.gt") ||
dnsDomainIs(host, "com.es.gt"))
return "DIRECT";
else return "PROXY 10.1.1.116:8080";
else return "DIRECT";
}
运行正常,但很多用户抱怨,因为自部署 proxy.pac 以来,导航耗时太长。这似乎是导致问题的原因。dnsResolve
还有isInNet
其他方法可以改进此脚本吗?或者如何加速 DNS 解析?
答案1
您的组织中是否有多个代理服务器,并且此 .pac 文件应该特定于地址为 10.1.1.116 的服务器?如果没有,您可能只需取消该检查即可。由于FindProxyForURL()
浏览器需要发出的每个请求都会调用,dnsResolve()
因此可能会阻塞您的浏览器相当长一段时间,具体取决于您的 DNS 运行情况。
如果您需要该dnsResolve()
调用,那么解决这个问题的一种方法是将其移到外面FindProxyForURL()
:
var myProxyServerIP = dnsResolve("ProxyServer");
function FindProxyForURL(url, host) {
if (myProxyServerIP == "10.1.1.116")
if (dnsDomainLevels(host) == 0 ||
isInNet(host, "10.0.0.0","255.0.0.0") ||
isInNet(host, "125.0.0.0","255.0.0.0") ||
isInNet(host, "127.0.0.0","255.0.0.0") ||
isInNet(host, "204.223.70.250","255.255.255.255") ||
dnsDomainIs(host, ".muj.com") ||
dnsDomainIs(host, "sv.com.gt") ||
dnsDomainIs(host, "com.es.gt"))
return "DIRECT";
else return "PROXY 10.1.1.116:8080";
else return "DIRECT";
}
此更改将使其dnsResolve()
仅在加载 .pac 文件时调用,而不是每次向浏览器发出请求时调用。您需要根据该地址更改的频率自行确定是否可以在您的环境中执行此操作。但同样,您的代理服务器的地址应该是静态的。
您通过调用检查的子网是否与isInNet()
您通过调用检查的域是一对一映射dnsDomainIs()
?如果是这样,那么您就有冗余,并且可以删除一组调用。
除此之外,根据我从您的问题中了解到的关于您的环境的情况,我没有看到任何其他建议。
答案2
对于每个 isInNet 函数调用,如果主机不是 IP 地址,则进行一次 DNS 查找。这会减慢进程,因为您必须进行 4 次 DNS 查找并等待 DNS 服务器的响应。您可以执行以下操作将 DNS 调用次数减少到一次。
function FindProxyForURL(url, host) {
if (dnsResolve("ProxyServer") == "10.1.1.116")
hostip=dnsResolve(host);
if (dnsDomainLevels(host) == 0 ||
isInNet(hostip, "10.0.0.0","255.0.0.0") ||
isInNet(hostip, "125.0.0.0","255.0.0.0") ||
isInNet(hostip, "127.0.0.0","255.0.0.0") ||
isInNet(hostip, "204.223.70.250","255.255.255.255") ||
dnsDomainIs(host, ".muj.com") ||
dnsDomainIs(host, "sv.com.gt") ||
dnsDomainIs(host, "com.es.gt"))
return "DIRECT";
else return "PROXY 10.1.1.116:8080";
else return "DIRECT";
}