Domanda:
Che cos'è un file Proxy Pac e quali esempi?
Ambiente: Cisco Web Security Appliance
Nota: questo articolo della Knowledge Base fa riferimento a software non gestito o supportato da Cisco. Le informazioni sono fornite a titolo di cortesia. Per ulteriore assistenza, contattare il fornitore del software.
Link di riferimento: file di esempio di Auto-Proxy JavaScript o JScript
File di esempio JavaScript o JScript Auto-Proxy
I seguenti script spiegano come utilizzare un file ".pac" per specificare un URL auto-proxy. Per usare queste funzionalità, devi modificare i nomi, i numeri di porta e gli indirizzi IP del proxy.
- Le funzioni isInNet, isResolvable e dnsResolve interrogano un server DNS
- I riferimenti agli oggetti, alle proprietà o ai metodi del modello a oggetti generano un errore invisibile all'utente nel file di configurazione automatica proxy. Ad esempio, i riferimenti window.open(...), alert(...) e password(...) generano tutti errori nel file di configurazione automatica proxy in Internet Explorer.
Esempio 1: gli host locali si connettono direttamente, tutti gli altri tramite proxy
La funzione seguente verifica se il nome host è un host locale e, in caso affermativo, se la connessione è diretta. Se il nome host non è un host locale, la connessione avviene tramite il proxy (proxy).
funzione FindProxyForURL(url, host)
{
if (nomeHostPiana(host))
la dicitura "DIRECT" (diretta);
Altrimenti
restituire "proxy:80";
}
La funzione isPlainHostName verifica la presenza di punti nel nome host. In caso affermativo, restituisce false; in caso contrario, restituisce true.
Nota: per una connessione diretta al server Web locale, potrebbe essere necessaria una corrispondenza di dominio o subnet. Non tutte le richieste ai server Web locali vengono eseguite utilizzando solo i nomi host
Esempio 2: gli host all'interno del firewall si connettono direttamente, mentre i server locali esterni si connettono tramite proxy
La funzione seguente verifica se l'host è un nome host "normale" (ovvero se il nome di dominio non è incluso) o parte di un particolare dominio (.company.com) ma il nome host non è www o home.
funzione FindProxyForURL(url, host)
{
if (isPlainHostName(host) ||
dnsDomainIs(host, ".company.com") &&
!localHostOrDomainIs(host, "www.company.com") &&
!localHostOrDomainIs(host, "home.azienda.com")
la dicitura "DIRECT" (diretta);
Altrimenti
restituire "proxy:80";
}
Nota:
- La funzione localHostOrDomainIs viene eseguita solo per gli URL nel dominio locale.
- La funzione dnsDomainIs restituisce true se il dominio del nome host corrisponde al dominio specificato.
Esempio 3: se l'host è risolvibile, connettersi direttamente. In caso contrario, connettersi utilizzando un proxy.
La funzione seguente richiede al server DNS di tentare di risolvere il nome host passato. Se possibile, viene stabilita una connessione diretta. In caso contrario, la connessione viene effettuata tramite proxy. Ciò è utile quando si utilizza un server DNS interno per risolvere tutti i nomi host interni.
funzione FindProxyForURL(url, host)
{
if (isResolvable(host))
la dicitura "DIRECT" (diretta);
Altrimenti
restituire "proxy:80";
}
Vedere la nota sulla funzione isResolvable nella parte superiore della pagina.
Esempio 4: se l'host si trova nella subnet specificata, connettersi direttamente. In caso contrario, connettersi utilizzando un proxy.
La funzione seguente confronta un modello e una maschera di indirizzo IP specifici con il nome host. Ciò è utile se alcuni host di una subnet devono essere connessi direttamente e altri devono essere connessi tramite un proxy.
funzione FindProxyForURL(url, host)
{
if (isInNet(host, "999.99.9", "255.0.255.0"))
la dicitura "DIRECT" (diretta);
Altrimenti
restituire "proxy:80";
}
Vedere la nota sulla funzione isInNet nella parte superiore della pagina.
La funzione isInNet(host, modello, maschera) restituisce true se l'indirizzo IP dell'host corrisponde al modello specificato. La maschera indica la parte dell'indirizzo IP che deve corrispondere (255=corrispondenza, 0=ignora).
Esempio 5: Determinare il tipo di connessione in base al dominio host
La funzione seguente specifica una connessione diretta se l'host è locale. Se l'host non è locale, questa funzione determina il proxy da utilizzare in base al dominio host. Questa opzione è utile se il nome di dominio host è uno dei criteri per la selezione del proxy.
funzione FindProxyForURL(url, host)
{
if (nomeHostPiana(host))
la dicitura "DIRECT" (diretta);
else if (shExpMatch(host, "*.com")
restituisce "PROXY COMPROXY:80";
else if (shExpMatch(host, "*.edu")
restituire "PROXY eduproxy:80";
Altrimenti
restituisce "proxy";
}
La funzione shExpMatch(str, shexp) restituisce true se str corrisponde a shexp utilizzando modelli di espressioni della shell.
Esempio 6: determinare il tipo di connessione in base al protocollo in uso
La funzione seguente estrae il protocollo in uso ed effettua di conseguenza la selezione del proxy. Se il protocollo non corrisponde, viene stabilita una connessione diretta. Questa opzione è utile se il protocollo utilizzato è uno dei criteri per la selezione del proxy.
funzione FindProxyForURL(url, host)
{
if (url.substring(0, 5) == "http:") {
restituire "proxy:80";
}
else if (url.substring(0, 4) == "ftp:") {
restituire "PROXY fproxy:80";
}
else if (url.substring(0, 7) == "gopher:") {
restituisce "PROXY";
}
else if (url.substring(0, 6) == "https:") {
restituire "PROXY:8080";
}
Altrimenti {
la dicitura "DIRECT" (diretta);
}
}
La funzione substring estrae il numero di caratteri specificato da una stringa.
Esempio 7: Determinare l'impostazione del proxy controllando se il nome host corrisponde all'indirizzo IP
La funzione seguente effettua una selezione proxy convertendo il nome host in un indirizzo IP e confrontandolo con una stringa specificata.
funzione FindProxyForURL(url, host)
{
if (dnsResolve(host) == "999.99.99.999") { // = http://proxy
restituire "PROXY:8080";
}
Altrimenti {
restituire "proxy:80";
}
}
Vedere la nota sulla funzione dnsResolve nella parte superiore della pagina.
Esempio 8: se l'indirizzo IP dell'host corrisponde all'indirizzo IP specificato, connettersi tramite proxy, altrimenti connettersi direttamente
La seguente funzione è un altro modo per effettuare una selezione proxy basata sulla specifica di un indirizzo IP. In questo esempio, a differenza dell'esempio 7, viene utilizzata la chiamata di funzione per ottenere in modo esplicito l'indirizzo IP numerico (nell'esempio 7 viene utilizzata la funzione dnsResolve per convertire il nome host nell'indirizzo IP numerico).
funzione FindProxyForURL(url, host)
{
if (indirizzoIP() == "999.99.999.999") {
restituire "proxy:80";
}
Altrimenti {
la dicitura "DIRECT" (diretta);
}
}
La funzione myIpAddress restituisce l'indirizzo IP (in formato punto intero) dell'host su cui è in esecuzione il browser.
Esempio 9: se il nome host contiene punti, connettersi utilizzando un proxy. In caso contrario, effettuare la connessione direttamente.
La funzione seguente verifica il numero di punti presenti nel nome host. Se il nome host contiene dei punti, effettuare una connessione tramite proxy. Se il nome host non contiene punti, stabilire una connessione diretta. Questo è un altro modo per determinare i tipi di connessione in base alle caratteristiche del nome host.
funzione FindProxyForURL(url, host)
{
if (dnsDomainLevels(host) > 0) { // se il numero di punti in host > 0
restituire "proxy:80";
}
la dicitura "DIRECT" (diretta);
}
La funzione dnsDomainLevels restituisce un intero uguale al numero di punti nel nome host.
Esempio 10: specifica i giorni della settimana per la connessione tramite proxy, altri giorni per la connessione diretta
La funzione seguente determina il tipo di connessione specificando i giorni della settimana appropriati per un proxy. I giorni che non rientrano tra questi parametri utilizzano una connessione diretta. Questa funzione può essere utile nelle situazioni in cui si desidera utilizzare un proxy quando il traffico è pesante e consentire una connessione diretta quando il traffico è leggero.
funzione FindProxyForURL(url, host)
{
if(weekDayRange("MER", "SAT", "GMT"))
restituire "proxy:80";
Altrimenti
la dicitura "DIRECT" (diretta);
}
La funzione weekDayRange(day1 [,day2] [,GMT] ) restituisce se l'ora di sistema corrente rientra nell'intervallo specificato dai parametri day1, day2 e GMT. È necessario specificare solo il primo parametro. Il parametro GMT presume che i valori dell'ora siano espressi nell'ora di Greenwich anziché nel fuso orario locale.
Esempio 11: Bilanciamento del carico con una semplice funzione matematica
funzione FindProxyForURL(url, host){
return randomProxy();
}
funzione randomProxy()
{
switch( Math.floor( Math.random() *2))
{
caso 0: restituire "PROXY 1.1.1.1:3128; PROXY 2.2.2.2; PROXY DIRETTO;"
caso 1: restituire "PROXY 2.2.2.2:3128; PROXY 1.1.1.1; PROXY DIRETTO;"
}
}
In questi casi viene inoltre implementato un failover nel caso in cui un proxy non sia disponibile.