Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ostrzeżenie
Wycofana, nieobsługiwana aplikacja klasyczna Internet Explorer 11 ma zostać trwale wyłączona za pośrednictwem aktualizacji aplikacji Microsoft Edge dla niektórych wersji systemu Windows 10. Aby uzyskać więcej informacji, zobacz artykuł pt. Często zadawane pytania dotyczące wycofywania aplikacji klasycznej Internet Explorer 11.
W tym temacie wyjaśniono, jak zoptymalizować wydajność skryptu automatycznej konfiguracji serwera proxy (plik PAC, znany również jako Wpad.dat). Ten dokument koncentruje się na rozwiązywaniu problemów z serwerami intranetowymi bezpośrednio i zewnętrznym ruchem wewnętrznym za pośrednictwem serwera proxy.
Aby uzyskać więcej informacji na temat funkcji używanych do oceny adresu (adresu URL lub nazwy hosta), zobacz: Używanie plików autokonfiguracji serwera proxy (pac) z programem IEAK 11.
Uwaga
Funkcje isInNet()
, isResolvable()
i dnsResolve()
wysyłają zapytania do podsystemu DNS. W związku z tym należy unikać lub przynajmniej zminimalizować użycie tych funkcji.
Wykonywanie zapytań dotyczących nazw NetBIOS
Nazwy NetBIOS (nazwy serwerów, które nie zawierają kropki) są używane tylko w intranecie i nie są kierowane przez serwer proxy:
if (isPlainHostName(host))
return "DIRECT";
Zapytanie dotyczące wewnętrznych sufiksów DNS
Strefy DNS używane wewnętrznie są zwykle przekierowywane bezpośrednio. Najprostszym sposobem określenia takich hostów jest użycie dnsDomainis
funkcji :
if (dnsDomainIs(host, ".dns.company.com"))
return "DIRECT";
Alternatywną i szybszą metodą dla tego samego wyniku można uzyskać za pomocą metody ShExMatch()
. Ta funkcja wykonuje porównanie ciągów. Zwraca ten sam wynik, ale dodaje gwiazdkę (*) jako symbol wieloznaczny:
if (shExpMatch(host, "*.dns.company.com"))
return "DIRECT";
Zapytanie dotyczące zakresów adresów IP
Jeśli adres IP hosta należy do lokalnego intranetu, niezależnie od nazwy serwera internetowego, powinien pominąć serwer proxy, aby przejść bezpośrednio.
Jeśli adres IP zostanie wprowadzony bezpośrednio na pasku adresu, nie musisz go ponownie rozpoznać. Możesz użyć następującego kodu, aby sprawdzić, czy host jest już w formacie adresu IP:
var isIpV4Addr = /^(\d+.){3}\d+$/;
ret = isIpV4Addr.test(host);
Ten kod sprawdza, czy host zmiennej zawiera trzy cyfry, po których następuje kropka, a następnie kolejne cyfry. Wynik jest następnie przekazywany do zmiennej o nazwie return. Wynik ma wartość "true" dla adresu IP i "false" w innym przypadku.
W poniższym fragmencie kodu zmienna host IP zawiera adres IP do wykorzystania w przyszłych kontrolach.
var hostIP;
var isIpV4Addr = /^(\d+.){3}\d+$/;
if (isIpV4Addr.test(host))
hostIP = host;
else
hostIP = dnsResolve(host);
Gdy nieistnieny host jest przekazywany do funkcji (na przykład użytkownik wprowadził coś źle na pasku adresu), wynik adresu IP hosta może być zerowy. Każda dodatkowa obsługa błędów będzie wykonywana przez serwer proxy:
if (hostIP==0)
return "PROXY myproxy:80";
Ponieważ mamy adres IP hosta, należy sprawdzić wewnętrzne zakresy adresów IP.
Jeśli to możliwe, użyj shExpMatch
funkcji zamiast isInNet
. Następujące fragmenty kodu mają identyczne wyniki, chociaż shExpMatch
działają szybciej:
if (isInNet(hostIP, "95.53.0.0", "255.255.0.0"))
return "DIRECT";
if (shExpMatch(hostIP, "95.53.*"))
return "DIRECT";
Język JavaScript uwzględnia wielkość liter
Skrypt serwera proxy używa języka JavaScript. JavaScript jest wrażliwy na wielkość liter. W związku z tym klauzula if
, która jest wielką literą, nigdy nie stanie się prawdziwa, podczas gdy inne parametry używają małych liter. Sam program Internet Explorer konwertuje zmienne host
i url
na małe litery przed wywołaniem FindProxyForURL
funkcji.
Ten warunek nie jest prawdziwy dla WinHTTP
. Dzieje się tak, ponieważ WinHTTP
przekazuje element host
i url
bezpośrednio do funkcji.
W związku z tym parametry, które są sprawdzane w pliku PAC, należy przekonwertować w ramach PAC, zanim zostaną ocenione.
host = host.toLowerCase();
Korzystanie z protokołu IPv6
Jeśli chcesz używać adresów IPv6 i obsługiwać je, program Internet Explorer obsługuje je, ponieważ program Internet Explorer jest uwzględniony w każdej aktualnie obsługiwanej wersji systemu Windows (i w winHTTP od systemu Windows Vista). Jednak w tym przypadku należy użyć funkcji "Ex" (takich jak isInNetEx()
), jak wspomniano w następującym artykule:
Definicje interfejsu API pomocnika serwera proxy obsługujące protokół IPv6
Aby zapoznać się z przykładem implementacji myIpAddressEx
, zobacz funkcja "myIpAddress" zwraca niepoprawny wynik w programie Internet Explorer 9.
Testowanie pliku PAC
Jeśli skrypt zawiera jakikolwiek błąd składniowy (na przykład brak znaku ")" w if
instrukcji, skrypt nie jest uruchamiany. Aby zminimalizować błędy, rozważ użycie edytora skryptów, który uruchamia sprawdzanie składni. Za pomocą programu Visual Studio można zmienić nazwę rozszerzenia pliku PAC na ".js" podczas edycji, ale zmienić jego nazwę z powrotem na ".pac" przed przekazaniem go do serwera internetowego.
Uwaga
Począwszy od systemu Windows 10, nie można już używać plików PAC opartych na plikach. Aby uzyskać więcej informacji, zobacz następujące artykuły:
Testowanie za pomocą Autoprox.exe
Czasami musisz przetestować plik PAC, nawet jeśli nie masz dostępu do witryny internetowej. W tym celu możesz użyć narzędzia wiersza polecenia Autoprox.exe.
Jeśli otworzysz narzędzie w poleceniu bez użycia dodatkowych parametrów, otrzymasz następujący wynik pomocy:
C:\temp>autoprox
Help for AUTOPROX.EXE
Version : 2.44 (12/16/2019)
Usage : AUTOPROX -a (calling DetectAutoProxyUrl and saving wpad.dat file in temporary file if success)
Usage : AUTOPROX -n (calling DetectAutoProxyUrl with PROXY_AUTO_DETECT_TYPE_DNS_A only and saving wpad.dat file in temporary file if success)
Usage : AUTOPROX [-o] [-d] [-v] [-u:url] [-p:Path to autoproxy file] [-i:IP address]
-o: calls InternetInitializeAutoProxyDll with helper functions implemented in AUTOPROX
-i:IP Address: calls InternetInitializeAutoProxyDll with helper functions implemented in AUTOPROX and using provided IP Address
-v: verbose output for helper functions
For debugging: -d plus HKEY_CURRENT_USER\Software\Microsoft\Windows Script\Settings\JITDebug=1
AUTOPROX -u:url: calling DetectAutoProxyUrl and using autoproxy file to find the proxy for the url
AUTOPROX -u:url -p:path: using the autoproxy file/url from the path to find proxy for the url
Example: autoprox http://www.microsoft.com -> calling DetectAutoProxyUrl and using WPAD if found
Example: autoprox -o -u:http://www.microsoft.com -p:c:\inetpub\wwwroot\wpad.dat
Example: autoprox -u:http://www.microsoft.com -p:http://proxy/wpad.dat
Example: autoprox -d -u:http://www.microsoft.com -p:http://proxy/wpad.dat
Oto dane wyjściowe, jeśli korzystają z naszego przykładu:
C:\temp>autoprox -u:https://us.msn.com -p:c:\temp\sample.pac
Searching proxy for url : https://us.msn.com
Searching proxy using file : c:\temp\sample.pac
The Winsock 2.2 dll was found okay
Calling InternetInitializeAutoProxyDll with c:\temp\sample.pac
Calling InternetGetProxyInfo for url https://us.msn.com and host us.msn.com
Proxy returned for url https://us.msn.com is:
PROXY myproxy:80;
Obsługa błędów w Autoprox.exe
Jeśli plik PAC zawiera błędy składni, zostanie wyświetlony następujący komunikat:
BŁĄD: Nie powiodła się funkcja InternetGetProxyInfo z numerem błędu 0x3eb 1003.
Po zakończeniu testu lokalnego należy skopiować plik PAC na serwer internetowy, na którym będzie uzyskiwany dostęp za pośrednictwem protokołu HTTP.
Przykład:
function FindProxyForURL(url, host) {
// NetBIOS-names
if (isPlainHostName(host))
return "DIRECT";
// change to lower case, if not already been done
host = host.toLowerCase();
// internal DNS-suffixes
if (shExpMatch(host, "*.corp.company.com") ||
shExpMatch(host, "*.dns.company.com"))
return "DIRECT";
// Save the IP-address to variable hostIP
var hostIP;
var isIpV4Addr = /^(\d+.){3}\d+$/;
if (isIpV4Addr.test(host))
hostIP = host;
else
hostIP = dnsResolve(host);
// IP could not be determined -> go to proxy
if (hostIP == 0)
return "PROXY myproxy:80";
// These 3 scopes are used only internally
if (shExpMatch(hostIP, "95.53.*") ||
shExpMatch(hostIP, "192.168.*") ||
shExpMatch(hostIP, "127.0.0.1"))
return "DIRECT";
// Eveything else goes through the proxy
return "PROXY myproxy:80;";
}
Wyłączenie odpowiedzialności za kontakty z osobami trzecimi
Firma Microsoft udostępnia informacje kontaktowe innych firm, aby uzyskać dodatkowe informacje na temat tego tematu. Informacje te mogą zostać zmienione bez powiadomienia. Firma Microsoft nie gwarantuje dokładności informacji kontaktowych innych firm.