Назад | Перейти на главную страницу

Функции dnsResolve и isInNet Проблема

У нас есть файл 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 являются причиной проблемы. Есть ли другой способ улучшить этот скрипт? или как ускорить разрешение днс?

У вас есть несколько прокси-серверов в вашей организации, и этот файл .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() звонки? Если это так, то у вас есть избыточность и вы можете удалить один набор вызовов.

Кроме этого, я не вижу ничего другого, что можно было бы порекомендовать, исходя из того, что я могу различить о вашей среде из вашего вопроса.

Для каждого вызова функции isInNet выполняется поиск в DNS, если хост не является IP-адресом. Это замедлит процесс, так как вам придется выполнить 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";
}