Синтаксис на PAC (Proxy auto-config)
Ако откриете грешка или имате предложение, оставете съобщение във форума на Mudfish (https://forums.mudfish.net). Примерите и обясненията тук са преведени или съставени въз основа на следните сайтове:
Разширенията Mudfish за браузър поддържат файловия формат PAC (Proxy auto-config).
Функции на PAC
Браузърите с поддръжка на PAC обикновено поддържат функциите от стандартния формат, определен от Netscape.
Тези функции обаче работят в изолирана среда (sandbox) със строги ограничения. Например достъпът до информацията за 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 адреса с шаблон на shell и връща 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 адрес на вашия компютър.
Примерът изпраща заявките през прокси 10.10.5.1 на порт 8080, ако компютърът е в зададения IP диапазон.
// 만약 나의 컴퓨터가 특정 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 при успех.
Ако домейнът не се разрешава правилно, браузърът може временно да замръзне или да спре. Използвайте внимателно.
Примерът изпраща заявката през proxy1.example.com, ако DNS сървърът може да разреши името на хоста.
// 만약 요청한 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 сутринта до 6 вечерта, а през останалото време се свързва директно.
// 오직 아침 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);