В сети сравнительно мало информации об такой замечательной вещи как «Автоматическая настройка прокси сервера». Суть технологии заключается в том, что браузер читает специальный файл написаный на языке 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/Chrome:
Сервис -> Свойства обозревателя -> Подключения -> Настройка сети поставить галочку напротив опции «Автоматическое определение параметров» или поставить галочку напротив опции «Использовать сценарий автоматической настройки» и в поле «Адрес» написать путь до PAC файла. Например: wpad.example.com:80/wpad.dat
в браузере Opera:
Настройки -> Дополнительно -> Сеть -> Прокси-серверы поставить галочку напротив опции «Автоматическая конфигурация прокси-сервера» и в поле «Адрес» написать путь до PAC файла.
в браузере Firefox:
Инструменты->Настройки->Дополнительно->Сеть->Соединение(Настроить) выбирать опции «Автоматически определять настройки прокси для этой сети» или выбирать опцию «URL автоматической настройки сервиса прокси» и в поле «Адрес» написать путь до PAC файла.
Еще один пример файла proxy.pac:
function FindProxyForURL(url, host) {
// If the hostname matches, send direct.
if (dnsDomainIs(host, "intranet.domain.com") ||
shExpMatch(host, "(*.abcdomain.com|abcdomain.com)"))
return "DIRECT";
// If the protocol or URL matches, send direct.
if (url.substring(0, 4)=="ftp:" ||
shExpMatch(url, "http://abcdomain.com/folder/*"))
return "DIRECT";
// If the requested website is hosted within the internal network, send direct.
if (isPlainHostName(host) ||
shExpMatch(host, "*.local") ||
isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))
return "DIRECT";
// If the IP address of the local machine is within a defined
// subnet, send to a specific proxy.
if (isInNet(myIpAddress(), "10.10.5.0", "255.255.255.0"))
return "PROXY 1.2.3.4:8080";
// DEFAULT RULE: All other traffic, use below proxies, in fail-over order.
return "PROXY 4.5.6.7:8080; PROXY 7.8.9.10:8080";
}
Больше полезной информации можно почерпнуть по адресу en.wikipedia.org/wiki/Proxy_auto-config
Успехов.
No comments:
Post a Comment
А что вы думаете по этому поводу?