用筆記本上網時,往返家裏和單位,由於單位是用的代理上網,家裏是直接鏈接.所以每次都要修改IE的代理設置,雖然是個小事,可是每次都要修改老是有點煩 ,因而參考GOOGLE,寫了一個自動配置代理的腳本.這樣不管在家和在公司,只要連上局域網就能夠上網了 .html
function FindProxyForURL(url,host) {
if((isPlainHostName(host))||shExpMatch(url,"http://127.0.0.1/*")||isInNet(host,"192.168.0.0", "255.255.255.0")) {
return "direct";
} else {
if(myIpAddress()=="192.168.0.49")
return "PROXY 192.168.0.6:808";
else
return "direct";
}
}服務器
把以上代碼另存爲proxy.pac的文件,如:c:\proxy.pac,而後在IE的菜單裏"工具"->"INTEL選項"->"鏈接"->局域網設置
把使用自動配置腳本選上,而後在地址欄填入file://c:/proxy.pac,注意file後是兩斜槓,要使設置生效,須要關閉IE再從新打開.
如今咱們介紹下這個proxy.pac腳本文件,腳本的語法是js語法,js的內置函數可使用,要實現自動配置代理,須要實現FindProxyForURL這個函數,其參數url表明要訪問的鏈接,host表明要訪問鏈接的主機名,該函數有三個返回參數
direct:直接鏈接
proxy IP:PORT
socket IP:PORT
返回結果大小寫不敏感
PAC的其餘內置語法見http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html負載均衡
PAC腳本另一個重要的應用是多臺代理服務器並存的狀況下,經過pac腳本的控制:dom
· 用戶隨機選擇使用多臺代理服務器中的任意一臺來達到流量負載均衡的目的;socket
· 管理員經過PAC腳本控制用戶使用和不使用某臺代理服務器,這樣能夠空出時間對代理服務器進行維護;函數
· 讓服務器工做在主備模式,當主服務器宕機時,會自動切換到其它備用服務器而不會中斷服務;工具
· 根據訪問目的地的不一樣,自動選擇最佳代理服務器。學習
下面列舉幾個PAC的實例,順便學習下它的語法
a、isPlainHostName(host),本例演示判斷是否爲本地主機,如http://myservername/
的方式訪問,若是是直接鏈接,不然使用代理url
function FindProxyForURL(url, host)
{
if (isPlainHostName(host))
return "DIRECT";
else
return "PROXY proxy:80";
}.net
b、dnsDomainIs(host, "")、localHostOrDomainIs(host, ""),本例演示判斷訪問主機
是否屬於某個域和某個域名,若是屬於.company.com域的主機名,而域名不是
www.company.com和home.company.com的直接鏈接,不然使用代理訪問。
function FindProxyForURL(url, host)
{
if ((isPlainHostName(host) ||
dnsDomainIs(host, ".company.com")) &&
!localHostOrDomainIs(host, "www.company.com") &&
!localHostOrDomainIs(host, "home.company.com"))
return "DIRECT";
else
return "PROXY proxy:80";
}
c、isResolvable(host),本例演示主機名可否被dns服務器解析,若是能直接訪問,否
則就經過代理訪問。
function FindProxyForURL(url, host)
{
if (isResolvable(host))
return "DIRECT";
else
return "PROXY proxy:80";
}
d、isInNet(host, "", ""),本例演示訪問IP是否在某個子網內,若是是就直接訪問,
不然就經過代理,例子演示訪問清華IP段的主頁不用代理。
function FindProxyForURL(url, host)
{
if (isInNet(host, "166.111.0.0", "255.255.0.0"))
return "DIRECT";
else
return "PROXY proxy:80";
}
e、shExpMatch(host, ""),本例演示根據主機域名來改變鏈接類型,本地主機、*.edu、
*.com分別用不一樣的鏈接方式。
function FindProxyForURL(url, host)
{
if (isPlainHostName(host))
return "DIRECT";
else if (shExpMatch(host, "*.com"))
return "PROXY comproxy:80";
else if (shExpMatch(host, "*.edu"))
return "PROXY eduproxy:80";
else
return "PROXY proxy:80";
}
f、url.substring(),本例演示根據不一樣的協議來選擇不一樣的代理,http、https、ftp、
gopher分別使用不一樣的代理。
function FindProxyForURL(url, host)
{
if (url.substring(0, 5) == "http:") {
return "PROXY proxy:80";
}
else if (url.substring(0, 4) == "ftp:") {
return "PROXY fproxy:80";
}
else if (url.substring(0, 7) == "gopher:") {
return "PROXY gproxy";
}
else if (url.substring(0, 6) == "https:") {
return "PROXY secproxy:8080";
}
else {
return "DIRECT";
}
}
g、dnsResolve(host),本例演示判斷訪問主機是否某個IP,若是是就使用代理,不然直
接鏈接。
function FindProxyForURL(url, host)
{
if (dnsResolve(host) == "166.111.8.237") {
return "PROXY secproxy:8080";
}
else {
return "PROXY proxy:80";
}
}
h、myIpAddress(),本例演示判斷本地IP是否某個IP,若是是就使用代理,不然直接使
用鏈接。
function FindProxyForURL(url, host)
{
if (myIpAddress() == "166.111.8.238") {
return "PROXY proxy:80";
}
else {
return "DIRECT";
}
}
i、dnsDomainLevels(host),本例演示訪問主機的域名級數是幾級,就是域名有幾個點
若是域名中有點,就經過代理訪問,不然直接鏈接。
function FindProxyForURL(url, host)
{
if (dnsDomainLevels(host) > 0) { // if number of dots in host > 0
return "PROXY proxy:80";
}
return "DIRECT";
}
j、weekdayRange(),本例演示當前日期的範圍來改變使用代理,若是是GMT時間週三
到週六,使用代理鏈接,不然直接鏈接。
function FindProxyForURL(url, host)
{
if(weekdayRange("WED", "SAT", "GMT"))
return "PROXY proxy:80";
else
return "DIRECT";
}
k、最後一個例子是演示隨機使用代理,這樣能夠好好利用代理服務器。
function FindProxyForURL(url,host){return randomProxy();}function randomProxy(){switch( Math.floor( Math.random() * 5 ) ){case 0:return "PROXY proxy1:80";break;case 1:return "PROXY proxy2:80";break;case 2:return "PROXY proxy3:80";break;case 3:return "PROXY proxy4:80";break;case 4:return "PROXY proxy5:80";break;}}