Синтаксис PAC (Proxy auto-config)
Якщо ви знайшли помилку в документі або маєте пропозицію, залиште повідомлення на форумі Mudfish (https://forums.mudfish.net). Приклади й пояснення в цьому документі перекладено або підготовлено з використанням матеріалів таких сайтів:
Розширення Mudfish для браузера підтримує формат PAC (Proxy auto-config).
Функції PAC
Браузери з підтримкою PAC зазвичай надають функції, визначені стандартним форматом Netscape.
Однак вони працюють у пісочниці, тобто в суворо обмеженому середовищі. Наприклад, доступ до інформації User Agent повністю заборонено.
Нижче описано функції, доступні в пісочниці. Код і його початкові корейські коментарі збережено; перед кожним прикладом наведено українське пояснення коментарів.
dnsDomainIs
Перевіряє ім'я хоста й повертає true, якщо воно збігається із заданим доменом. Зазвичай використовується для перевірки окремих хостів-винятків.
У прикладі, якщо ім'я хоста дорівнює google.com або належить його піддоменам, як-от maps.google.com чи www.google.com, браузер підключається безпосередньо, без проксі.
// 만약 hostname 이 google.com 과 같거나 하위 주소들이 매치된다면
// (예를 들어 maps.google.com, www.google.com),
// 브라우저로 하여금 proxy 을 거치지 않고 직접 접속하게 합니다.
if (dnsDomainIs(host, "google.com"))
return "DIRECT";
shExpMatch
Порівнює ім'я хоста або URL-адресу з рядком у форматі шаблону оболонки й повертає true за збігу.
Перший приклад спрямовує всі запити до імен хостів, що закінчуються на .local, безпосередньо, без проксі. Другий приклад робить те саме для vpn.domain.com і всіх файлів або папок під http://abcdomain.com/folder/.
// 모든 request 들 (.local 로 끝나는 모든 hostname 에 해당) 이
// 브라우저로 하여금 proxy 을 거치지 않고 직접 접속하게 합니다.
if (shExpMatch(url, "*.local"))
return "DIRECT";
// vpn.domain.com 에 접속할려고 하거나
// http://abcdomain.com/folder/ 하위의 모든 폴더 혹은 파일에 접속하는
// 요청들을 proxy 경유없이 직접 접속합니다.
if (shExpMatch(host, "vpn.domain.com") ||
shExpMatch(url, "http://abcdomain.com/folder/*"))
return "DIRECT";
isInNet
Перевіряє IP-адресу хоста й повертає true, якщо вона належить указаній підмережі. Якщо аргументом є ім'я хоста, воно перетворюється на IP-адресу через DNS.
У прикладі пряме з'єднання використовується, якщо IP-адреса запитаного хоста після DNS-перетворення належить указаному діапазону.
// 만약 요청한 hostname 의 IP 주소가 (DNS resolving 후) 인자로 넘겨진
// IP 대역에 포함되는 것이면 직접 접속합니다.
if (isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0"))
return "DIRECT";
myIpAddress
Повертає IP-адресу поточного комп'ютера.
У прикладі, якщо комп'ютер належить указаному діапазону IP-адрес, запит надсилається через проксі 10.10.5.1 на порту 8080.
// 만약 나의 컴퓨터가 특정 IP 대역에 속할 경우 proxy 10.10.5.1 (포트는 8080)
// 를 통해 요청하도록 합니다.
if (isInNet(myIpAddress(), "10.10.1.0", "255.255.255.0"))
return "PROXY 10.10.5.1:8080";
dnsResolve
Перетворює ім'я хоста на IP-адресу за допомогою DNS.
У прикладі пряме з'єднання використовується, якщо IP-адреса запитаного хоста належить одному з указаних діапазонів.
// 만약 요청한 host 의 IP 가 지정한 범위에 속할 경우 직접 접속하도록
// 합니다.
if (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";
isPlainHostName
Повертає true, якщо ім'я хоста не містить жодної крапки. Наприклад, це стосується http://intranet; функція зазвичай корисна для доступу до внутрішніх вебадрес.
У прикладі запити до простих імен хостів, як-от http://intranet/ або http://webserver-name01/, виконуються безпосередньо.
// 만약 사용자가 plain hostname (예를 들면, http://intranet/ 혹은
// http://webserver-name01/) 를 요청할 경우, 직접 접속하도록 합니다.
if (isPlainHostName(host))
return "DIRECT";
localHostOrDomainIs
Перевіряє ім'я хоста й повертає true, якщо частина імені хоста збігається.
У прикладі пряме з'єднання використовується, якщо запитане ім'я хоста — «www» або «www.google.com».
// 만약 요청한 hostname 이 "www" 혹은 "www.google.com" 일 경우, 직접
// 접속합니다.
if (localHostOrDomainIs(host, "www.google.com"))
return "DIRECT";
isResolvable
Намагається перетворити ім'я хоста на IP-адресу й повертає true, якщо це вдалося.
Якщо домен не вдається належним чином визначити через DNS, браузер може ненадовго зависнути. Використовуйте цю функцію обережно.
У прикладі, якщо DNS-сервер може визначити IP-адресу запитаного хоста, запит надсилається через проксі proxy1.example.com.
// 만약 요청한 hostname 이 DNS 서버로 부터 resolving 이 될 수 있다면,
// proxy1.example.com 프록시를 통해 요청합니다.
if (isResolvable(host))
return "PROXY proxy1.example.com:8080";
dnsDomainLevels
Перевіряє ім'я хоста й повертає кількість крапок у ньому. Наприклад, функцію можна використовувати для винятків для внутрішніх вебсерверів.
У прикладі, якщо ім'я хоста містить хоча б одну крапку, використовується проксі proxy1.example.com; інакше з'єднання пряме.
// 만약 hostname 이 . (dot) 을 하나라도 포함하고 있으면 proxy1.example.com
// 프록시를 통해 접속하고 그렇지 않으면 직접 접속합니다.
if (dnsDomainLevels(host) > 0)
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";
weekdayRange
Дає змогу створювати правила на основі часу, наприклад повертати налаштування проксі лише в певні дні.
У прикладі з понеділка по п'ятницю використовується проксі proxy1.example.com, а в інші дні — пряме підключення до Інтернету.
// 만약 월요일부터 금요일 사이에는 proxy1.example.com 프록시를 사용하도록
// 하고 그렇지 않을 경우는 직접 인터넷에 접속하도록 합니다.
if (weekdayRange("MON", "FRI"))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";
dateRange
Дає змогу створювати правила на основі часу, наприклад використовувати проксі лише в певні місяці.
У прикладі з січня по березень використовується проксі proxy1.example.com, а в інші місяці — пряме з'єднання.
// 만약 1월부터 3월까지는 proxy1.example.com 프록시를 사용하도록 설정하고
// 그렇지 않을 경우는 직접 접속하도록 조치합니다.
if (dateRange("JAN", "MAR"))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";
timeRange
Використовується, щоб вмикати проксі лише в певний проміжок доби.
У прикладі проксі proxy1.example.com використовується лише з 8:00 до 18:00, а в інший час з'єднання пряме.
// 오직 아침 8 시부터 오후 6 시까지만 proxy1.example.com 을 사용하도록
// 하고 그렇지 않을 경우는 직접 접속합니다.
if (timeRange(8, 18))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";
alert
Цієї функції не було в початковому визначенні формату PAC, але Internet Explorer і Firefox надають її для діагностики проблем.
У прикладі результат DNS-перетворення виводиться в консоль помилок браузера.
// 브라우저의 error 콘솔창에 DNS resolving 한 결과를 출력하도록 합니다.
resolved_host = dnsResolve(host);
alert(resolved_host);