Необходимо, чтобы некоторые из наших ноутбуков работали как в нашей собственной, так и в клиентской сети. Это часто связано с переключением настроек прокси, что мы сначала делали с помощью специального файла proxy.pac (после некоторой вашей помощи Вот). Теперь у одной из используемых сетей есть собственный proxy.pac, который мы должны использовать, что означает, что в настоящее время мы должны вручную изменить расположение proxy.pac для этой сети.
Итак, есть ли способ написать proxy.pac таким образом, чтобы он при некоторых обстоятельствах подчинялся другому proxy.pac?
Нет, не в статическом файле .pac. Проблема будет в том, что вы в конечном итоге переопределите функцию FindProxyForURL () при загрузке второго файла, что отключит интерпретатор javascript.
Вам нужно будет разработать динамическую страницу (ASP, PHP и т. Д.), Которая будет реализовывать требуемую логику, а затем, в зависимости от решения, считывать содержимое желаемого файла .pac и передавать его обратно клиенту. Я использовал это для создания некоторой динамической балансировки нагрузки между прокси-серверами, которые у меня были в разных физических местах, и у меня это хорошо сработало.
Если вы решите пойти по этому пути, убедитесь, что сценарий, который вы пишете, устанавливает тип возвращаемого mime на application / x-ns-proxy-autoconfig или application / x-javascript-config, иначе ваш браузер не распознает его как файл pac. .
После того, как IE разозлился из-за того, что у меня нет быстрого и простого способа отключить настройки прокси, этот вопрос вдохновил меня написать этот файл PAC на PHP.
Он определяет, выполняется ли запрос файла изнутри (в этом случае используйте прокси-сервер) или извне: идите напрямую. Возможно, кто-то сможет настроить его под свои нужды.
<?php
$proxy = "192.168.0.x";
$port = "8080";
header ("Content-type: application/x-ns-proxy-autoconfig");
header ("Date: " . gmdate('D, d M Y H:i:s \G\M\T', time ()));
header ("Last-Modified: " . gmdate('D, d M Y H:i:s \G\M\T', time ()));
header ("Expires: " . gmdate('D, d M Y H:i:s \G\M\T', time () + 60 * 30));
echo "// Request from: " . $_SERVER ['REMOTE_ADDR'] . "\n";
if (substr ($_SERVER ['REMOTE_ADDR'], 0, 8) == "192.168.")
{
?>
// We're inside the firewall
var external = false;
<?php
}
else
{
?>
// We're outside the firewall
var external = true;
<?php
}
?>
// Default connection
var direct = "DIRECT";
// Alternate Proxy Server
var proxy = "PROXY <?php echo $proxy; ?>:<?php echo $port; ?>";
//
// Proxy Logic
//
function FindProxyForURL(url, host)
{
if (external || isPlainHostName(host) || shExpMatch(host, "192.168.*") || (dnsDomainIs(host, ".example.com")) && !localHostOrDomainIs(host, "www.example.com") || dnsDomainIs (host, ".example2.com"))
{
return direct;
}
else
{
return proxy;
}
}
Теперь я скорректировал настройки своей групповой политики, чтобы все браузеры указывали на этот файл, расположенный на веб-сервере внутри брандмауэра. Теперь, если ноутбуки перестанут работать, их прокси-файл изменится автоматически без необходимости перенастраивать настройки прокси-сервера в браузере.
Редактировать: обновлен для соответствия локальным IP-адресам хостам ...
Вы могли бы использовать WPAD (автоматическое обнаружение веб-прокси) для распространения разных файлов proxy.pac в разных сетях.
Но вам понадобится простой веб-сервер в каждой из сетей и поисковый домен предоставлен dhcp должны быть разными в каждой из сетей. Если каждый веб-сервер размещает свой файл proxy.pac под URL-адресом http: // wpad [.dhcp-search-domain.com] /wpad.dat, тогда все, что вам нужно сделать, это установить «автообнаружение» в настройках прокси-сервера вашего браузера и перезапускать браузер каждый раз, когда вы переключаетесь между сетями.
Если вам действительно повезло, у вашего клиента уже есть работающее автообнаружение прокси, а вы просто пропустили его из-за вашей статической конфигурации proxy.pac ...