Назад | Перейти на главную страницу

Есть ли способ связать файлы proxy.pac через URL?

Необходимо, чтобы некоторые из наших ноутбуков работали как в нашей собственной, так и в клиентской сети. Это часто связано с переключением настроек прокси, что мы сначала делали с помощью специального файла 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 ...