Konfigurowanie ustawień proxy przy użyciu PAC, aby powrócić do DIRECT, gdy serwer proxy jest niedostępny

1

Mam następujący plik .pac:

function FindProxyForURL(url, host)
{
    return "PROXY proxy.example.com:8080; DIRECT;";
}

Używam FoxyProxy z Firefoksem 13 i spodziewałem się, że powróci do niego DIRECT jeśli dany serwer proxy nie jest dostępny. Zamiast tego dostaję wiadomość Firefox jest skonfigurowany do używania serwera proxy, którego nie można znaleźć. Czy moje oczekiwania są błędne? Czy jest jakiś sposób, aby zachowywał się tak, jak bym chciał?

Dan Stevens
źródło

Odpowiedzi:

0

Powinieneś powiedzieć to wyraźnie, aby przejść BEZPOŚREDNIE.

Najlepszym sposobem kontrolowania tego jest wykrycie sieci, w której się znajdujesz. Oto przykład proxy.pac, który jest trochę bardziej złożony:

function FindProxyForURL(url, host) {
    // Variables
    var proxy_LAN1 = "PROXY 10.61.9.200:8080; DIRECT;"; 
    var LAN1_addr_ip4 = "10.97.100.0"; 
    var LAN1_addr_ip6 = "fe80::b892:6a74:9635:*"; // Needed for FF/TB (Mozilla)
    var proxy_no = "DIRECT";
    var alert_done = 99;

    //alert("My Addr: " + myIpAddress() + "\nURL: " + url + "\nHost: " + host);

    // If address is local, always go direct
    if( isPlainHostName(host) ) {
        //alert("Local address so no proxy");
        return proxy_no;
    }

    // Proxy if PC is on LAN1
    if (isInNet(myIpAddress(), LAN1_addr_ip4, "255.255.255.0") || shExpMatch(myIpAddress(), LAN1_addr_ip6) ) {
        //alert("LAN1 address & proxy");
        return proxy_LAN1;
    }

    // Default to a direct connection
    // alert("Default proxy (none)");
    return proxy_no;
}

/*
NOTES:
    Use alert("xxx") to find out what is happening. IE displays a pop-up, FF/TB use the error console
    Can have multiple proxies to try. Separate each with ;
    For local pac files, IE requires "file://c:\proxy.pac", FF/TB require file:///c:\proxy.pac" (extra /)
    FF/TB - myIpAddress() returns an IPv6 rather than IPv4 address for Vista and Win7 so isInNet() doesn't work!
FUNCTIONS:
    alert(text)
    isPlainHostName(host)
    shExpMatch(lookup, match)
    isInNet(address, lookup.address, netmask)
    myIpAddress()
    dnsDomainIs(host, ".foobar")
EXAMPLES:
    if (shExpMatch(url, "http://192.168.1.100*")) { return proxy_no; }
    if (isInNet(myIpAddress(), "192.168.1.0", "255.255.255.0"))
*/

Jak widać, próbuje to wykryć, czy jesteśmy w określonej sieci i ustawia tylko proxy, jeśli to prawda.

Julian Knight
źródło
Myślę, że pytanie dotyczyło bardziej dostępności, tj. Czy serwer proxy nie działa. Nie można tego osiągnąć, różnicując podsieć.
doublehelix
Ach, nie sądzę, żeby to działało tak, jak pliki proxy.pac. Zazwyczaj zawsze powinieneś mieć ten sam adres proxy dla tej samej sieci. Powinieneś upewnić się, że twoje serwery proxy są odporne, więc jeśli się nie powiedzie, są inne, które zajmą się obciążeniem, w przeciwnym razie narażasz całą sieć na ryzyko. Dlatego plik proxy.pac skupia się na zrozumieniu, na jakiej sieci się znajdujesz. Innym problemem jest to, że IE sprawdza przynajmniej proxy dla konkretnego adresu URL raz na sesję.
Julian Knight