Suppose you are using your Ubuntu Desktop laptop at home and workplace. When you are at your workplace, the corporate network your laptop is connected to is behind proxy. You would then have to turn on/off proxy depending on where you are. Of course you could manually update proxy settings of Ubuntu Desktop every time your network changes, but that’d be quite cumbersome. That’s when proxy auto-config can help.
A proxy auto-config (PAC) is a powerful mechanism that allows one to conditionally define proxy settings for web browsers. Using PAC, you can automatically switch proxy settings based on destination URL, IP address of local host, time of day, etc. As you can imagine, PAC is extremely useful for setting up proxy exceptions, proxy load balancing, network-aware conditional proxy, etc.
$ sudo vi /etc/proxy.pac
function FindProxyForURL(url, host) { if (isInNet(myIpAddress(), "1.2.3.0", "255.255.255.0")) { if (isInNet(host, "192.168.0.0", "255.255.0.0")) return "DIRECT"; if (shExpMatch(url, "http:*")) return "PROXY my.proxy.com:8000" ; if (shExpMatch(url, "https:*")) return "PROXY my.proxy.com:8000" ; if (shExpMatch(url, "ftp:*")) return "PROXY my.proxy.com:8000" ; return "DIRECT"; } else { return "DIRECT"; } }
In this PAC file, if you are connected to 1.2.3.0/24
network (assuming that is the corporate network), you use proxy (my.proxy.com:8000
) for all destinations other than 192.168.0.0/24
. Otherwise, you do not use proxy at all.
Alternatively, you can also use gsettings
tool to enable PAC from the command line.
To make your Proxy Auto Configuration APC work you need a PAC file and a server to host it.
- Write a PAC file with appropriate proxy configuration
- Hosting the file: Put it on a web server where the client browser can access it
- Setting up client browser for suing the PAC file to get and use proxy configuration
- Check if the traffic is going through the proxy server
- Example Automatic Proxy Configuration PAC file
- Hosting the PAC file on a web server for client to access
- Setting up client browser for using the PAC file to get and use proxy configuration
- Firefox
- Chrome
- IE
- Check if the traffic is going through proxy
- Configure the IP address of localhost
- Файл автоматической конфигурации прокси (PAC)
- Формат возвращаемого значения
- Предопределенные функции и окружение
- dnsDomainIs()
- Use proxy auto configuration on Firefox
- Proxy Auto-Configuration (PAC) file
- Syntax
- Parameters
- Description
- Return value format
- Predefined functions and environment
- isPlainHostName()
- dnsDomainIs()
- localHostOrDomainIs()
- isResolvable()
- isInNet()
- dnsResolve()
- convert_addr()
- myIpAddress()
- dnsDomainLevels()
- shExpMatch()
- weekdayRange()
- dateRange()
- timeRange()
- alert()
Example Automatic Proxy Configuration PAC file
Proxy Auto-Configuration is a specialized JavaScript function definition that a browser calls to determine how requests are handled.
First of all create a PAC file which has all the proxy necessary setting you would like your browser to use,
function FindProxyForURL(url, host)
if (shExpMatch(url, “http:*”))
return “PROXY 192.168.0.250:3128” ;
if (shExpMatch(url, “https:*”))
return “PROXY 192.168.0.250:3128” ;
if (shExpMatch(url, “ftp:*”))
return “PROXY 192.168.0.250:3128” ;
In this configuration file, I am declaring my proxy server as 192.168.0.250 port 3128. The client should use this proxy for http, https and ftp requests.
Hosting the PAC file on a web server for client to access
Host your Proxy Auto Configuration file in a web server. This should work on any web environment as long as the right configuration parameters are entered. amusing the name of the web serverserver is http://www.example.com
i have tested it using apache 2 on redhat 5
Upload the file in server root /var/www/html/proxy.pac
AddType application/x-ns-proxy-autoconfig .pac
AddType application/x-ns-proxy-autoconfig .dat #used for configuring auto detect setting using DNS
Restart/Reload apache to activate the new configuration
This is to make the “proxy.pac” file accessible using the url http://www.example.com/proxy.pac
Setting up client browser for using the PAC file to get and use proxy configuration
After we are down with creating a PAC file appropriate for the network and hosting it on a web server from where web client has a direct access to, we need to configure the client use the PAC file for proxy configuration.
I shall put an example of firefox, Chrome and IE
Firefox
Option -> network -> Settings
Select automatic proxy configuration URL:
Enter the full url where you have placed your PAC file and this url should be access able directly from the client browser, example
Chrome
Settings -> show advanced settings (at the bottom) -> Change proxy settings
Under connections tab click on LAN settings
Enable Use Automatic configuration script (disable all other option)
Enter the full url where you have placed your PAC file and this url should be access able directly from the client browser, example
IE
Tools -> internet option -> connection -> LAN setting
Enable Use Automatic configuration script (disable all other option)
Enter the full url where you have placed your PAC file and this url should be access able directly from the client browser, example
Check if the traffic is going through proxy
In my setup I have been using squid as a proxy, so I monitor for “tail -f /var/log/squid/access.log” and check for traffic request from the client. Make sure any transparent proxy configuration is turned off to avoid wrong reading.
If your traffic is passing through the proxy server, congratulations you have successfully configured automatic proxy configuration server with a PAC file.
Setting up web proxy Autodiscovery protocol using DNS
Configure the IP address of localhost
There is one last important thing to do before finalizing PAC configuration. In the PAC file you created, myIpAddress()
is supposed to return the IP address of localhost
correctly. As a final step, you should verify that is the case by using hostname
command.
$ hostname -i
If the hostname
command returns 127.0.0.1
, not an actual IP address assigned to your laptop, then myIpAddress()
will also return 127.0.0.1
, and the above proxy auto configuration will fail. To get around this problem, you need to set up the real IP address of local host somewhere.
In Linux, you can hard code the IP address of local host in /etc/hosts
. However, since the IP address of localhost
may keep changing depending on where you are, you can write a start-up script which automatically generates /etc/hosts
upon boot.
To do that, first rename the original /etc/hosts
to something else, which will then be used to generate an actual /etc/hosts
to use.
$ sudo mv /etc/hosts /etc/hosts.custom
$ vi hostname.sh
#!/bin/bash WIRED_IP=`ifconfig eth0 | sed -ne 's/.*inet addr:([^ ]*).*/1/p'` WIRELESS_IP=`ifconfig wlan0 | sed -ne 's/.*inet addr:([^ ]*).*/1/p'` HOST_IP=${WIRED_IP:-$WIRELESS_IP} HOST_NAME="your_host_name" cat /etc/hosts.custom > /etc/hosts cat >> /etc/hosts << EOF # This file is automatically generated by /sbin/hostname.sh $HOST_IP $HOST_NAME EOF exit 0
The script hostname.sh
takes the IP address of either eth0
(for wired) or wlan0
(for wireless), and puts it in /etc/hosts
.
$ sudo chmod 755 hostname.sh $ sudo cp hostname.sh /etc/NetworkManager/dispatcher.d
Now the hostname.sh
script will get executed to update /etc/hosts
automatically every time any wired or wireless network interface is up.
An alternative way to run the hostname.sh
script is to configure your Ubuntu Desktop, so that the script automatically gets executed when you log in to your desktop.
After using either of the above two methods, verify that your hostname can successfully be resolved to IP address after you log in.
$ hostname -i
1.2.3.100
Proxy auto configuration is now set up on Ubuntu Desktop. Your Ubuntu Desktop will automatically turn on or off proxy depending on where you are at home or workplace.
Файл автоматической конфигурации прокси (PAC)
<span data-i18n="06fe2028c6d41d5f963c85bb23a2f9582052e0be/c5" data-source="A Proxy Auto-Configuration (PAC) file is a JavaScript function that determines whether web browser requests (HTTP, HTTPS, and FTP) go directly to the destination or are forwarded to a web proxy server. The JavaScript function contained in the PAC file defines the function:» onmousemove=»i18n(this)»>Proxy Auto-Configuration (PAC) файл является функцией JavaScript , который определяет , является ли запросы веб — браузера (HTTP, HTTPS и FTP) перейти непосредственно к месту назначения или направляются к веб — прокси — сервер. Функция JavaScript, содержащаяся в файле PAC, определяет функцию:
() { }
url
<span data-i18n="ab68e1cdf6b3b2fc5d165ae5d131fcb809d37323/d4" data-source="The URL being accessed. The path and query components of
https://
URLs are stripped. In Chrome (versions 52 to 73), you can disable this by settingPacHttpsUrlStrippingEnabled
tofalse
in policy or by launching with the--unsafe-pac-url
command-line flag (in Chrome 74, only the flag works, and from 75 onward, there is no way to disable path-stripping; as of Chrome 81, path-stripping does not apply to HTTP URLs, but there is interest in changing this behavior to match HTTPS); in Firefox, the preference isnetwork.proxy.autoconfig_url.include_path
.» onmousemove=»i18n(this)»>URL-адрес, к которому осуществляется доступ. Компоненты пути и запроса URLhttps://
удаляются. В Chrome (версии с 52 по 73) вы можете отключить это, установив дляPacHttpsUrlStrippingEnabled
значениеfalse
в политике или запустив с--unsafe-pac-url
командной строки —unsafe-pac-url (в Chrome 74 работает только флаг, а с 75 и далее). , нет способа отключить удаление пути; начиная с Chrome 81, удаление пути не применяется к URL-адресам HTTP, но есть интерес изменить это поведение, чтобы оно соответствовало HTTPS); в Firefox предпочтение —network.proxy.autoconfig_url.include_path
.host
<span data-i18n="5f24db479cf2b72fa937bcb464d99834bc0f6796/56" data-source="The hostname extracted from the URL. This is only for convenience; it is the same string as between
://
and the first:
or/
after that. The port number is not included in this parameter. It can be extracted from the URL when necessary.» onmousemove=»i18n(this)»>Имя хоста, извлеченное из URL-адреса. Это только для удобства; это та же строка, что и между://
и первым:
или/
после этого. Номер порта не входит в этот параметр. При необходимости его можно извлечь из URL-адреса.
<span data-i18n="a5275c587d1874bd04ab3b907533a732dac13af3/92" data-source="Returns a string describing the configuration. The format of this string is defined in return value format below.» onmousemove=»i18n(this)»>Возвращает строку, описывающую конфигурацию. Формат этой строки определяется в формате возвращаемого значения ниже.
Формат возвращаемого значения
- Функция JavaScript возвращает единственную строку
- Если строка нулевая,прокси-серверы не должны использоваться
- Строка может содержать любое количество следующих строительных блоков,разделенных точкой с запятой:
DIRECT
Соединения должны осуществляться напрямую,без каких-либо прокси-серверов.
PROXY host:port
Необходимо использовать указанный прокси-сервер
SOCKS host:port
Должен использоваться указанный сервер SOCKS
Последние версии поддержки Firefox:
HTTP host:port
Необходимо использовать указанный прокси-сервер
HTTPS host:port
Необходимо использовать указанный HTTPS прокси
- <span data-i18n="1d79b8d63c02c4e1e3bea9761ae45935bea1e215/c9" data-source="
SOCKS4 host:port
,SOCKS5 host:port
» onmousemove=»i18n(this)»>SOCKS4 host:port
,SOCKS5 host:port
Следует использовать указанный SOCKS-сервер (с указанной версией SOCK)
Если есть несколько настроек с точкой с запятой,то будет использоваться крайняя левая настройка,пока Firefox не установит соединение с прокси-сервером.В этом случае будет использовано следующее значение и т.д.
По истечении 30 минут браузер автоматически повторит попытку использования ранее не отвечавшего прокси-сервера.Дополнительные попытки будут продолжаться,начиная с одного часа,всегда добавляя 30 минут к истекшему времени между попытками.
Если все прокси не работают,и не указана опция DIRECT,браузер спросит,следует ли временно игнорировать прокси,а также делать попытки прямого подключения.Через 20 минут браузер спросит,следует ли перепробовать прокси,и спросит еще раз через 40 минут.Запросы будут продолжаться,всегда добавляя 20 минут к истекшему времени между запросами.
PROXY w3proxy.netscape.com:8080; PROXY mozilla.netscape.com:8081
Первичный прокси-это w3proxy:8080;если это снижается,начинайте использовать mozilla:8081,пока первичный прокси не появится снова.
PROXY w3proxy.netscape.com:8080; PROXY mozilla.netscape.com:8081; DIRECT
То же самое,что и выше,но если оба прокси-сервера падают,то автоматически начинают делать прямые соединения.(В первом примере,приведенном выше,Netscape запросит подтверждение пользователя о создании прямого соединения;в этом случае никакого вмешательства пользователя нет).
PROXY w3proxy.netscape.com:8080; SOCKS socks:1080
Используйте SOCKS,если основной прокси-сервер не работает.
<span data-i18n="2484849ce31ec75991b42e401455ef29930353fe/c4" data-source="The auto-config file should be saved to a file with a .pac filename extension: proxy.pac
.» onmousemove=»i18n(this)»>Файл автоконфигурации следует сохранить в файл с расширением .pac: proxy.pac
.
<span data-i18n="5e61ea683e19ab67e26dd1a6156d5fd67682c56c/63" data-source="And the MIME type should be set to application/x-ns-proxy-autoconfig
.» onmousemove=»i18n(this)»>И тип MIME должен быть установлен как application/x-ns-proxy-autoconfig
.
Далее,вы должны настроить свой сервер на сопоставление расширения имени файла .pac с MIME типом.
- Функция JavaScript всегда должна быть сохранена в файл сама по себе,но не должна быть встроена в HTML-файл или любой другой файл.
- Примеры,приведенные в конце этого документа,являются полными.Нет необходимости в дополнительном синтаксисе,чтобы сохранить его в файл и использовать.(Конечно,JavaScripts необходимо отредактировать,чтобы отразить доменное имя и/или подсети вашего сайта).
Предопределенные функции и окружение
Эти функции могут быть использованы при создании файла PAC:
<span data-i18n="d629cb4339e120f01ae644b0efd03ceaf40c19a8/64" data-source="Note: pactester (part of the pacparser package) was used to test the following syntax examples.» onmousemove=»i18n(this)»>Примечание: pactester (часть пакета pacparser ) использовался для тестирования следующих примеров синтаксиса.
- <span data-i18n="b865b396cc503b061720f4db16c1a8fdc2531248/e4" data-source="The PAC file is named
proxy.pac
» onmousemove=»i18n(this)»>Файл PAC называетсяproxy.pac
. - <span data-i18n="62674fb494832a5696aeff81df38c79717f4136f/6c" data-source="Command line:
pactester -p ~/pacparser-master/tests/proxy.pac -u http://www.mozilla.org
(passes thehost
parameterwww.mozilla.org
and theurl
parameterhttp://www.mozilla.org
)» onmousemove=»i18n(this)»>Командная строка:pactester -p ~/pacparser-master/tests/proxy.pac -u http://www.mozilla.org
(передает параметрhost
www.mozilla.org
и параметрurl
http://www.mozilla.org
)
Имя хоста с URL (за исключением номера порта).
Правда,если и только если в имени хоста нет доменного имени (нет точек).
("www.mozilla.org") ("www")
dnsDomainIs()
(host, domain)
Это имя хоста с URL-адреса.
Это доменное имя для проверки имени хоста.
Возвращает значение true только в том случае,если домен имени хоста совпадает.
dnsDomainIs(, ) // dnsDomainIs(, ) //
(host, hostdom)
Имя хоста из URL.
Полностью квалифицированный хозяин матча против.
<span data-i18n="0331e5317c1a5353192cf6b448ec4dc07116aaba/32" data-source="Is true if the hostname matches exactly the specified hostname, or if there is no domain name part in the hostname, but the unqualified hostname matches.» onmousemove=»i18n(this)»>Верно, если имя хоста точно совпадает с указанным именем хоста или если в имени хоста нет части имени домена, но совпадает неквалифицированное имя хоста.
localHostOrDomainIs(, ) // (exact ) localHostOrDomainIs(, ) // (hostname , domain specified) localHostOrDomainIs(, ) // (domain name mismatch) localHostOrDomainIs(, ) // (hostname mismatch)
это имя хоста из URL.
Пытается разрешить имя хоста.Возвращает правду,если получится.
("www.mozilla.org")
(host, pattern, mask)
Спецификация модели и маски выполняется так же,как и для конфигурации SOCKS.
() {
();
}
() {
('isInNet(host, "63.245.213.24", "255.255.255.255")');
}
имя хоста для решения.
("www.mozilla.org");
Концентрирует четыре разделенных точками байта в одно 4-байтовое слово и преобразует его в десятичный.
(".");
это имя хоста из URL.
Возвращает количество (целое)уровней домена DNS (количество точек)в имени хоста.
("www"); ("mozilla.org"); ("www.mozilla.org");
это любая строка для сравнения (например,URL или имя хоста).
это выражение скорлупы для сравнения.
<span data-i18n="48c3adebd75ddfb4a64369c924d3e15dfeba0d11/3f" data-source="Returns true
if the string matches the specified shell glob expression.» onmousemove=»i18n(this)»>Возвращает true
если строка соответствует указанному выражению глобуса оболочки.
<span data-i18n="ee3fffca49da6615930a4c466eb0714466a8e334/70" data-source="Note: If supported by the client, JavaScript regular expressions typically provide a more powerful and consistent way to pattern-match URLs (and other strings).» onmousemove=»i18n(this)»>Примечание. Регулярные выражения JavaScript, если они поддерживаются клиентом, обычно обеспечивают более эффективный и последовательный способ сопоставления URL-адресов (и других строк) с шаблоном.
shExpMatch(, ); returns shExpMatch(, ); returns
(wd1, wd2, [gmt])
<span data-i18n="f212eaf13d457df83503062dead709db68c15700/08" data-source="Note: (Before Firefox 49) wd1 must be less than wd2 if you want the function to evaluate these parameters as a range. See the warning below.» onmousemove=»i18n(this)»>Примечание. (До Firefox 49) wd1 должно быть меньше wd2, если вы хотите, чтобы функция оценивала эти параметры как диапазон. См. Предупреждение ниже.
- вд1 и вд2
<span data-i18n="35421825ec7af2180a52d2e2cd0be7b5af7a7022/af" data-source="One of the ordered weekday strings:
"SUN"
,"MON"
,"TUE"
,"WED"
,"THU"
,"FRI"
,"SAT"
» onmousemove=»i18n(this)»>Одна из упорядоченных строк дня недели:"SUN"
,"MON"
,"TUE"
,"WED"
,"THU"
,"FRI"
,"SAT"
Это либо строка «GMT»,либо она пропущена.
Обязательным является только первый параметр.Или второй,и третий,или оба могут быть пропущены.
Если присутствует только один параметр,функция возвращает значение true в день недели,который представляет параметр.Если в качестве второго параметра указана строка «GMT»,то время принимается равным GMT.В противном случае предполагается,что они находятся в локальном часовом поясе.
<span data-i18n="e16e968a5389294434183eb145169cd64e832fbe/dc" data-source="If both wd1 and wd1 are defined, the condition is true if the current weekday is in between those two ordered weekdays. Bounds are inclusive, but the bounds are ordered. If the "GMT" parameter is specified, times are taken to be in GMT. Otherwise, the local timezone is used.» onmousemove=»i18n(this)»>Если определены и wd1, и wd1 , условие истинно, если текущий день недели находится между этими двумя упорядоченными днями недели. Границы инклюзивные, но упорядоченные . Если указан параметр «GMT», время будет в GMT. В противном случае используется местный часовой пояс.
<span data-i18n="56e7e94a265849deeab8906ff90cbbc764c80d3c/88" data-source="Warning:The order of the days matters. Before Firefox 49, weekdayRange("SUN", "SAT")
will always evaluate to true
. Now weekdayRange("WED", "SUN")
will only evaluate to true
if the current day is Wednesday or Sunday.» onmousemove=»i18n(this)»>Предупреждение: порядок дней имеет значение . До Firefox 49 weekdayRange("SUN", "SAT")
всегда будет иметь значение true
. Теперь weekdayRange("WED", "SUN")
будет оцениваться как true
если текущий день — среда или воскресенье.
weekdayRange("MON", "FRI"); Monday through Friday ( timezone) weekdayRange("MON", "FRI", "GMT"); Monday through Friday (GMT timezone) weekdayRange("SAT"); Saturdays weekdayRange("SAT", "GMT"); Saturdays GMT weekdayRange("FRI", "MON"); Friday Monday (note, does matter)
dateRange( | | , [gmt]) // ambiguity is resolved by assuming year is greater than 31 dateRange(, , [gmt]) dateRange(, , [gmt]) dateRange(, , [gmt]) dateRange(, , , , [gmt]) dateRange(, , , , [gmt]) dateRange(, , , , , , [gmt])
<span data-i18n="3b316619bdbd38e5eb09b72d3590ee1f38d38423/7b" data-source="Note: (Before Firefox 49) day1 must be less than day2, month1 must be less than month2, and year1 must be less than year2 if you want the function to evaluate these parameters as a range. See the warning below.» onmousemove=»i18n(this)»>Примечание. (До Firefox 49) день1 должен быть меньше дня2, месяц1 должен быть меньше месяца2, а год1 должен быть меньше года2, если вы хотите, чтобы функция оценивала эти параметры как диапазон. См. Предупреждение ниже.
Это упорядоченный день месяца между 1 и 31 (в виде целого числа).
1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31
Это одна из строк заказанного месяца внизу.
|||||||||||
<span data-i18n="7165ac45c85ea0d30878e33d1b544beb92ad0407/3a" data-source="Is the ordered full year integer number. For example, 2016 (not 16).» onmousemove=»i18n(this)»>Заказанное целое число за полный год. Например, 2016 (а не 16).
Либо строка «GMT»,которая делает сравнение времени происходящим в часовом поясе GMT,либо пропущена.Если оставить без указания,время принимается за локальный часовой пояс.
<span data-i18n="219c745dfe181251ec5c580abc0c14da79c6b291/b0" data-source="If only a single value is specified (from each category: day, month, year), the function returns a true value only on days that match that specification. If both values are specified, the result is true between those times, including bounds, but the bounds are ordered.» onmousemove=»i18n(this)»>Если указано только одно значение (из каждой категории: день, месяц, год), функция возвращает истинное значение только в дни, соответствующие этой спецификации. Если указаны оба значения, результат будет истинным между этими временами, включая границы, но границы упорядочены .
<span data-i18n="2c516fb7cf9a097a725d7bdd7fe03a247b7d1993/9d" data-source="Warning:The order of the days, months, and years matter; Before Firefox 49, dateRange("JAN", "DEC")
will always evaluate to true
. Now dateRange("DEC", "JAN")
will only evaluate true if the current month is December or January.» onmousemove=»i18n(this)»>Предупреждение: порядок дней, месяцев и лет имеет значение ; До Firefox 49 dateRange("JAN", "DEC")
всегда будет иметь значение true
. Теперь dateRange("DEC", "JAN")
будет оценивать значение true, только если текущий месяц декабрь или январь.
dateRange(); the , timezone dateRange(, "GMT") the , GMT timezone dateRange(, ); the half dateRange(, "DEC"); th December dateRange("JAN", "MAR"); the quarter the dateRange(, "JUN", , "AUG"); June st until August th, (including June st August th) dateRange(, "JUN", , , "AUG", ); June st, , until August th, same dateRange("OCT", , "MAR", ); October until March (including the entire October March ) dateRange(); during the entire dateRange(, ); beginning until the
// The full range of expansions is analogous to dateRange. timeRange(, , , , , , [gmt])
<span data-i18n="eda34147dff2822c526f0b3fd2765a2a1c87aa47/2a" data-source="Note: (Before Firefox 49) the category hour1, min1, sec1 must be less than the category hour2, min2, sec2 if you want the function to evaluate these parameters as a range. See the warning below.» onmousemove=»i18n(this)»>Примечание. (До Firefox 49) категория hour1, min1, sec1 должна быть меньше категории hour2, min2, sec2, если вы хотите, чтобы функция оценивала эти параметры как диапазон. См. Предупреждение ниже.
это час с 0 до 23.(0-полночь,23-11 вечера.)
Минуты от 0 до 59.
Секунды от 0 до 59.
Либо строка «GMT» для GMT часового пояса,либо не указана для локального часового пояса.
<span data-i18n="ebc918364962297bbe2d03e861cdada5a4d5d17c/82" data-source="If only a single value is specified (from each category: hour, minute, second), the function returns a true value only at times that match that specification. If both values are specified, the result is true between those times, including bounds, but the bounds are ordered.» onmousemove=»i18n(this)»>Если указано только одно значение (из каждой категории: час, минута, секунда), функция возвращает истинное значение только в моменты времени, соответствующие этой спецификации. Если указаны оба значения, результат будет истинным между этими временами, включая границы, но границы упорядочены .
<span data-i18n="e7672b8bc1e63798a5eb68d404fb1dedfb9a99de/ba" data-source="Warning:The order of the hour, minute, second matter; Before Firefox 49, timeRange(0, 23)
will always evaluate to true. Now timeRange(23, 0)
will only evaluate true if the current hour is 23:00 or midnight.» onmousemove=»i18n(this)»>Предупреждение: порядок часа, минуты, секунды ; До Firefox 49 значение timeRange(0, 23)
всегда было истинным. Теперь timeRange(23, 0)
будет оценивать true только в том случае, если текущий час — 23:00 или полночь.
(); (, ); (, "GMT"); (, ); (, , , ); (, , , , , );
Строка для записи в журнал
Записывает сообщение в консоль браузера.
();
("Error: shouldn't reach this clause.");
© 2005–2022 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_PAC_file
HTTP
Use proxy auto configuration on Firefox
First open up Connection Settings
menu in Firefox preferences. Then enter resources:///proxy.pac
as the automatic proxy configuration URL.
Then create a symbolic link to /etc/proxy.pac
inside the directory where Firefox executable exists (e.g., /usr/bin
).
$ sudo ln -s /etc/proxy.pac /usr/bin/proxy.pac
Once you restart Firefox, it will start using the proxy auto configuration.
Proxy Auto-Configuration (PAC) file
A Proxy Auto-Configuration (PAC) file is a JavaScript function that determines whether web browser requests (HTTP, HTTPS, and FTP) go directly to the destination or are forwarded to a web proxy server. The JavaScript function contained in the PAC file defines the function:
Syntax
() { }
Parameters
url
The URL being accessed. The path and query components of
https://
URLs are stripped. In Chrome (versions 52 to 73), you can disable this by settingPacHttpsUrlStrippingEnabled
tofalse
in policy or by launching with the--unsafe-pac-url
command-line flag (in Chrome 74, only the flag works, and from 75 onward, there is no way to disable path-stripping; as of Chrome 81, path-stripping does not apply to HTTP URLs, but there is interest in changing this behavior to match HTTPS); in Firefox, the preference isnetwork.proxy.autoconfig_url.include_path
.host
The hostname extracted from the URL. This is only for convenience; it is the same string as between
://
and the first:
or/
after that. The port number is not included in this parameter. It can be extracted from the URL when necessary.
Description
Returns a string describing the configuration. The format of this string is defined in return value format below.
Return value format
- The JavaScript function returns a single string
- If the string is null, no proxies should be used
- The string can contain any number of the following building blocks, separated by a semicolon:
DIRECT
Connections should be made directly, without any proxies
PROXY host:port
The specified proxy should be used
SOCKS host:port
The specified SOCKS server should be used
Recent versions of Firefox support as well:
HTTP host:port
The specified proxy should be used
HTTPS host:port
The specified HTTPS proxy should be used
-
SOCKS4 host:port
,SOCKS5 host:port
The specified SOCKS server (with the specified SOCK version) should be used
If there are multiple semicolon-separated settings, the left-most setting will be used, until Firefox fails to establish the connection to the proxy. In that case, the next value will be used, etc.
The browser will automatically retry a previously unresponsive proxy after 30 minutes. Additional attempts will continue beginning at one hour, always adding 30 minutes to the elapsed time between attempts.
If all proxies are down, and there was no DIRECT option specified, the browser will ask if proxies should be temporarily ignored, and direct connections attempted. After 20 minutes, the browser will ask if proxies should be retried, asking again after an additional 40 minutes. Queries will continue, always adding 20 minutes to the elapsed time between queries.
Examples
PROXY w3proxy.netscape.com:8080; PROXY mozilla.netscape.com:8081
Primary proxy is w3proxy:8080; if that goes down start using mozilla:8081 until the primary proxy comes up again.
PROXY w3proxy.netscape.com:8080; PROXY mozilla.netscape.com:8081; DIRECT
PROXY w3proxy.netscape.com:8080; SOCKS socks:1080
Use SOCKS if the primary proxy goes down.
The auto-config file should be saved to a file with a .pac filename extension: proxy.pac
.
And the MIME type should be set to application/x-ns-proxy-autoconfig
.
Next, you should configure your server to map the .pac filename extension to the MIME type.
- The JavaScript function should always be saved to a file by itself but not be embedded in a HTML file or any other file.
- The examples at the end of this document are complete. There is no additional syntax needed to save it into a file and use it. (Of course, the JavaScripts must be edited to reflect your site’s domain name and/or subnets.)
Predefined functions and environment
These functions can be used in building the PAC file:
- The PAC file is named
proxy.pac
- Command line:
pactester -p ~/pacparser-master/tests/proxy.pac -u http://www.mozilla.org
(passes thehost
parameterwww.mozilla.org
and theurl
parameterhttp://www.mozilla.org
)
isPlainHostName()
Syntax
Parameters
- host
The hostname from the URL (excluding port number).
Description
True if and only if there is no domain name in the hostname (no dots).
Examples
("www.mozilla.org") ("www")
dnsDomainIs()
Syntax
(host, domain)
Parameters
- host
Is the hostname from the URL.
- domain
Is the domain name to test the hostname against.
Description
Returns true if and only if the domain of hostname matches.
Examples
dnsDomainIs(, ) // dnsDomainIs(, ) //
localHostOrDomainIs()
Syntax
(host, hostdom)
Parameters
- host
The hostname from the URL.
- hostdom
Fully qualified hostname to match against.
Description
Is true if the hostname matches exactly the specified hostname, or if there is no domain name part in the hostname, but the unqualified hostname matches.
Examples
localHostOrDomainIs(, ) // (exact ) localHostOrDomainIs(, ) // (hostname , domain specified) localHostOrDomainIs(, ) // (domain name mismatch) localHostOrDomainIs(, ) // (hostname mismatch)
isResolvable()
Syntax
Parameters
- host
is the hostname from the URL.
Tries to resolve the hostname. Returns true if succeeds.
Examples
("www.mozilla.org")
isInNet()
Syntax
(host, pattern, mask)
Parameters
- host
a DNS hostname, or IP address. If a hostname is passed, it will be resolved into an IP address by this function.
- pattern
an IP address pattern in the dot-separated format.
- mask
mask for the IP address pattern informing which parts of the IP address should be matched against. 0 means ignore, 255 means match.
True if and only if the IP address of the host matches the specified IP address pattern.
Pattern and mask specification is done the same way as for SOCKS configuration.
Examples
() {
();
}
() {
('isInNet(host, "63.245.213.24", "255.255.255.255")');
}
dnsResolve()
Parameters
- host
hostname to resolve.
Resolves the given DNS hostname into an IP address, and returns it in the dot-separated format as a string.
Example
("www.mozilla.org");
convert_addr()
Syntax
Parameters
- ipaddr
Any dotted address such as an IP address or mask.
Concatenates the four dot-separated bytes into one 4-byte word and converts it to decimal.
Example
(".");
myIpAddress()
Syntax
Parameters
Return value
Returns the server IP address of the machine Firefox is running on, as a string in the dot-separated integer format.
Warning: myIpAddress() returns the same IP address as the server address returned by nslookup localhost
on a Linux machine. It does not return the public IP address.
Example
dnsDomainLevels()
Syntax
Parameters
- host
is the hostname from the URL.
Returns the number (integer) of DNS domain levels (number of dots) in the hostname.
Examples
("www"); ("mozilla.org"); ("www.mozilla.org");
shExpMatch()
Syntax
Parameters
- str
is any string to compare (e.g. the URL, or the hostname).
- shexp
is a shell expression to compare against.
Returns true
if the string matches the specified shell glob expression.
Note: If supported by the client, JavaScript regular expressions typically provide a more powerful and consistent way to pattern-match URLs (and other strings).
Examples
shExpMatch(, ); returns shExpMatch(, ); returns
weekdayRange()
Syntax
(wd1, wd2, [gmt])
Note: (Before Firefox 49) wd1 must be less than wd2 if you want the function to evaluate these parameters as a range. See the warning below.
Parameters
- wd1 and wd2
One of the ordered weekday strings:
"SUN"
,"MON"
,"TUE"
,"WED"
,"THU"
,"FRI"
,"SAT"
- gmt
Is either the string «GMT» or is left out.
Only the first parameter is mandatory. Either the second, the third, or both may be left out.
If only one parameter is present, the function returns a value of true on the weekday that the parameter represents. If the string «GMT» is specified as a second parameter, times are taken to be in GMT. Otherwise, they are assumed to be in the local timezone.
If both wd1 and wd1 are defined, the condition is true if the current weekday is in between those two ordered weekdays. Bounds are inclusive, but the bounds are ordered. If the «GMT» parameter is specified, times are taken to be in GMT. Otherwise, the local timezone is used.
Warning:The order of the days matters. Before Firefox 49, weekdayRange("SUN", "SAT")
will always evaluate to true
. Now weekdayRange("WED", "SUN")
will only evaluate to true
if the current day is Wednesday or Sunday.
Examples
weekdayRange("MON", "FRI"); Monday through Friday ( timezone) weekdayRange("MON", "FRI", "GMT"); Monday through Friday (GMT timezone) weekdayRange("SAT"); Saturdays weekdayRange("SAT", "GMT"); Saturdays GMT weekdayRange("FRI", "MON"); Friday Monday (note, does matter)
dateRange()
Syntax
dateRange( | | , [gmt]) // ambiguity is resolved by assuming year is greater than 31 dateRange(, , [gmt]) dateRange(, , [gmt]) dateRange(, , [gmt]) dateRange(, , , , [gmt]) dateRange(, , , , [gmt]) dateRange(, , , , , , [gmt])
Note: (Before Firefox 49) day1 must be less than day2, month1 must be less than month2, and year1 must be less than year2 if you want the function to evaluate these parameters as a range. See the warning below.
Parameters
- day
Is the ordered day of the month between 1 and 31 (as an integer).
1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31
- month
Is one of the ordered month strings below.
|||||||||||
- year
Is the ordered full year integer number. For example, 2016 (not 16).
- gmt
Is either the string «GMT», which makes time comparison occur in GMT timezone, or is left out. If left unspecified, times are taken to be in the local timezone.
Warning:The order of the days, months, and years matter; Before Firefox 49, dateRange("JAN", "DEC")
will always evaluate to true
. Now dateRange("DEC", "JAN")
will only evaluate true if the current month is December or January.
Examples
dateRange(); the , timezone dateRange(, "GMT") the , GMT timezone dateRange(, ); the half dateRange(, "DEC"); th December dateRange("JAN", "MAR"); the quarter the dateRange(, "JUN", , "AUG"); June st until August th, (including June st August th) dateRange(, "JUN", , , "AUG", ); June st, , until August th, same dateRange("OCT", , "MAR", ); October until March (including the entire October March ) dateRange(); during the entire dateRange(, ); beginning until the
timeRange()
Syntax
// The full range of expansions is analogous to dateRange. timeRange(, , , , , , [gmt])
Note: (Before Firefox 49) the category hour1, min1, sec1 must be less than the category hour2, min2, sec2 if you want the function to evaluate these parameters as a range. See the warning below.
Parameters
- hour
Is the hour from 0 to 23. (0 is midnight, 23 is 11 pm.)
- min
Minutes from 0 to 59.
- sec
Seconds from 0 to 59.
- gmt
Either the string «GMT» for GMT timezone, or not specified, for local timezone.
Warning:The order of the hour, minute, second matter; Before Firefox 49, timeRange(0, 23)
will always evaluate to true. Now timeRange(23, 0)
will only evaluate true if the current hour is 23:00 or midnight.
Examples
(); (, ); (, "GMT"); (, ); (, , , ); (, , , , , );
alert()
Syntax
Parameters
- message
The string to log
Logs the message in the browser console.
Examples
();
("Error: shouldn't reach this clause.");
© 2005–2022 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_PAC_file