В рунете мало информации об такой замечательной вещи как «Автоматическая настройка прокси сервера». В этой статье я постараюсь подробно остановиться на данном вопросе.

Суть технологии заключается в том, что браузер читает специальный файл написаный на языке Javascript, в котором определена только одна функция:

Код:
function FindProxyForURL(url, host)
{
 ...
}

где,
url – полный URL запрашиваемого документа
host – имя поста извлекаемое из URL. Этот параметр необходим только для удобства. Он содержит всё от :// и до первого / или :. Номер порта не включается в этот параметр.

Функция возвращает строку содержащую один или несколько способов доступа к запрашиваемому документу. Формат строки следующий:

null — если строка null, то использовать прокси сервер не нужно;
DIRECT — прямое соединение без использования прокси;
PROXY host:port — определяет какой прокси сервер необходимо использовать;
SOCKS host:port — определяет SOCKS сервер который необходимо использовать.

Строка может содержать несколько приведенных выше параметров разделенных точкой с запятой. Тогда браузер будет перебирать их по очереди пока не найдёт доступный прокси сервер.
В главной функции могут быть вызваны следующие функции:

isPlainHostName(host) возвращает true если строка host не содержит точек (".").
dnsDomainIs(host, domain) вернет true если domain принадлежит host
localHostOrDomainIs(host, hostdomain) возвращает true если строка host (имя хоста или домена) содержится в строке hostdomain
isResolvable(host) возвращает true если возможно определить IP адрес для заданной строки host
isInNet(host, pattern, mask) возвращает true если IP адрес или имя хоста в строке host соответствует шаблону pattern и маске mask
dnsResolve(host) возвращает IP адрес для заданного host
myIpAddress() возвращает IP адрес компьютера
dnsDomainLevels(host) возвращает количество точек в строке host. Другими словами уровень домена
shExpMatch(str, shellexp) вернет true если строка str соответствует регулярному выражению в строке shellexp (формат регулярных выражений shellexp, а не regexp). Например shExpMatch("a/b/c","*/b/*") вернет true
weekdayRange(wd1 [, wd2 ][, "GMT"]) вернет true если текущая дата или дата заданная в параметре GTM, соответствует заданному дню недели или диапазону дней. Дни недели записываются в закавыченной строке из следующих вариантов (SUN|MON|TUE|WED|THU|FRI|SAT)
dateRange([day1] [,month1] [,year1] [,day2] [,month2] [,year2] [,"GMT"]) вернет true если текущая дата или дата заданная в параметре GTM попадает в указанный диапазон. Название месяца задается закавыченной строкой из следующих вариантов (JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)
timeRange(hour1, minute1, second1, hour2, minute2, second2 [, "GMT"])
timeRange(hour1, minute1, hour2, minute2 [, "GMT"])
timeRange(hour1, hour2 [, "GMT"])
timeRange(hour [, "GMT"])

Браузеры Firefox и Internet Explorer поддерживает только системную кодировку в PAC файле и не поддерживают Unicode кодировки, такие как UTF-8.

Приведу небольшой пример:

Код:
function FindProxyForURL(url, host)
{
 if (isPlainHostName(host) || dnsDomainIs(host, ".mydomain.com"))
  return "DIRECT";
 else if (shExpMatch(host, "*.com"))
  return "PROXY proxy1.mydomain.com:8080; " +
   "PROXY proxy4.mydomain.com:8080";
 else if (shExpMatch(host, "*.edu"))
  return "PROXY proxy2.mydomain.com:8080; " +
   "PROXY proxy4.mydomain.com:8080";
 else
  return "PROXY proxy3.mydomain.com:8080; " +
   "PROXY proxy4.mydomain.com:8080";
}

Данный скрип говорить устанавливать браузеру прямое соединение для локальных хостов или под доменов домена .mydomain.com. Для доменов из зоны .com используются прокси серверы 1 и 4, для доменов из зоны .edu прокси 2 и 4 ну и для всех оставшихся вариантов прокси 3 и 4.

Теперь остановлюсь на вопросе как указать браузеру использовать автоматическую конфигурацию прокси серверов. Для этого есть несколько вариантов:

Задать адрес скрипта вручную. Скрипт выкладывается на сервер доступный для пользователя. Обычно имя скрипта proxy.dat, однако если следовать спецификации WPAD скрипт следует назвать wpad.dat. Так же сервер должен отдавать файл с MIME типом application/x-ns-proxy-autoconfig
Второй способ WPAD метод основанный на DNS. Подробнее можно прочесть по ссылке ru.wikipedia.org/wiki/Web_Proxy_Autodiscovery_Protocol
И третий способ WPAD, основанный на DHCP. WPAD просто выдает PAC скрипт с выбранный номером 252 в «аренду» запросившему IP. Браузер получает URL скрипта и просто качает его по ссылке. Для этого необходимо:

Добавим в /etc/dhcp/dhcpd.conf следующие строчки.
option local-pac-server code 252 = text;
option local-pac-server "wpad.example.com:80/wpad.dat\000";
Перезапустите DHCP сервер.
Небольшой нюанс — у DHCP приоритет выше, чем у DNS, как следствие — гораздо быстрее. И можно вместо имени сайта указать его IP, в этом случае отсутствуют расходы времени на преобразование адреса в имя, что добавляет скорости.

Настройка браузеров. В параметрах программы нужно указать определение прокси-сервера:

В браузере Explorer
Сервис -> Свойства обозревателя -> Подключения -> Настройка сети
поставить галочку напротив опции «Автоматическое определение параметров»
или поставить галочку напротив опции «Использовать сценарий автоматической настройки» и в поле «Адрес» написать путь до PAC файла. Например: wpad.example.com:80/wpad.dat

В браузере Opera

Настройки -> Дополнительно -> Сеть -> Прокси-серверы
поставить галочку напротив опции «Автоматическая конфигурация прокси-сервера» и в поле «Адрес» написать путь до PAC файла.

В браузере Firefox
Инструменты->Настройки->Дополнительно->Сеть->Соединение(Настроить)
выберать опции «Автоматически определять настройки прокси для этой сети»
или выберать опцию «URL автоматической настройки сервиса прокси» и в поле «Адрес» написать путь до PAC файла.

Ещё несколько полезной информации можно почерпнуть по адресу en.wikipedia.org/wiki/Proxy_auto-config

Источник: https://habrahabr.ru/sandbox/19972/