PAC文件详解
PAC文件詳解
????????PAC文件是純文本文件,其實質為javascript腳本,其“.pac”后綴(proxy?auto?config)只是為了指定一個特定的程序來解析。
????????PAC文件中必須包含一個函數,FindProxyForURL(url,?host)。其中的url是用戶輸入的url,參數host是url中的主機名。比如url為
http://www.baidu.com/real/auto.js,那么host就是www.baidu.com。
????????一個簡單的PAC文件內容如下:
????????function?FindProxyForURL(url,?host)
????????{
??????????????return?"DIRECT";
????????}
????????這個PAC文件實際上什么也沒做,對任何URL,都將"DIRECT"(直接連網)。
????????當然,PAC文件除了可以return?"DIRECT"以外,還有兩種常用方式:
????????PROXY?proxysample.com:8080
????????//HTTP代理的主機和端口,主機也可以用IP表示
????????SOCKS5?socks5sample.com:1080
????????//SOCKS5代理的主機和端口,主機也可以用IP表示。
????????那么,我們可以猜測到,用pac指定一個HTTP代理應該這樣寫:
????????function?FindProxyForURL(url,?host)
????????{
????????????????return?"PROXY?192.168.1.1:3128";
????????}
????????甚至可以指定多個代理:
????????function?FindProxyForURL(url,?host)
????????{
????????????????return?"DIRECT;?PROXY?192.168.1.1:3128;?SOCKS5?lilinux.net:1080";
????????}
????????這段腳本的意思是:
????????STEP1.?對所有URL,都直接連接;
????????STEP2.?如果不能直接連接,那么就使用192.168.1.1:3128這個HTTP代理連接;
????????STEP3.?如果還是不能連接,則使用lilinux.net:1080這個SOCKS5代理連接。
????????也許你明確知道哪些網站不能直連,必須用PROXY或者SOCKS5連接,那么可以對站點分別指定代理配置:
????????function?FindProxyForURL(url,?host)
????????{
????????????????if?(shExpMatch(url,"*.google.com/*"))
????????????????{
??????????????????????return?"PROXY?192.168.1.1:3128";
????????????????}
????????????????if?(shExpMatch(url,?"*.wikipedia.com:*/*"))
????????????????{
??????????????????????return?"SOCKS5?lilinux.net:1080";
????????????????}
????????????????if?(isInNet(host,?"10.0.0.0",??"255.0.0.0"))
????????????????{
??????????????????????return?"DIRECT";
????????????????}
??????????????????????return?"DIRECT;?PROXY?192.168.1.1:3128;?SOCKS5?lilinux.net:1080";
????????}
????????這個PAC文件中引入了兩個新的函數,但從字面意思上,我們也可以猜出代碼的大概意思:
????????STEP1.?當url是*.google.com/*?時,自動使用PROXY代理;
????????STEP2.?當url是*.wikipedia.cm/*時,自動使用SOCKS5代理;
????????STEP3.?當host是10.0.0.0?/255.0.0.0的子網內時,自動直連;
????????STEP4.?如果都不匹配,則依次按DIRECT、PROXY、SOCKS5的次序嘗試。
????????shExpMatch函數用來匹配url或者host,匹配的方式和DOS的通配符相似。例如前面用到的"*.google.com/*"可以匹配任包含
".google.com/"的字符串。
????????isInNet函數用來返回請求的host是否在指定的域內。值得注意的是,isInNet的第二個參數必須是?IP,不能是主機名。因此需要把主機名
轉換成IP。比如"isInNet(host,?dnsResolve(www.google.com),?"255.255.255.0")"講到這里,應該可以解決你的問題了吧。
????????當然,PAC文件遠不止這么簡單,關于更詳細的內容請看這篇:PAC文件可以使用的JavaScript函數
PAC文件可以使用的JavaScript函數
下面是可用于FindProxyForURL()函數體中的條件函數:
基于主機名的函數:
- isPlainHostName()
- dnsDomainIs()
- localHostOrDomainIs()
- isResolvable()
- isInNet()
相關的實用程序函數:
- dnsResolve()
- myIpAddress()
- dnsDomainLevels()
基于 URL/主機名 的條件:
- shExpMatch()
基于時間的條件:
- weekdayRange()
- dateRange()
- timeRange()
- isPlainHostName(host)
host 即上文所述不包含端口號的,url中的主機名,下同,不再贅述。如果主機名中不包含域名則返回true。參考如下:
- isPlainHostName("www") 返回 true.
- isPlainHostName("www.google.com") 返回 false.
- dnsDomainIs(host, domain)
domain 用于和hostname進行比較的域名。如果hostname的域名和domain的值相匹配則返回true。參考如下:
- dnsDomainIs("www.google.com", ".google.com") 返回 true.
- dnsDomainIs("www", ".google.com") 返回 false.
- dnsDomainIs("www.apple.com", ".google.com") 返回 false.
- localHostOrDomainIs(host, hostdom)
hostdom 是要進行匹配的指定的主機名。如果hostname和指定的hostdom相匹配,或者在hostname中沒有指定要進行匹配的域名部分,函數返回 true。參考如下:
- localHostOrDomainIs("www. google.com", "www. google.com") 返回 true (exact match).
- localHostOrDomainIs("www", "www. google.com") 返回 true (hostname match, domain not specified).
- localHostOrDomainIs("www.apple.com", "www. google.com") 返回 false (domain name mismatch).
- localHostOrDomainIs("adc.apple.com", "www. google.com") 返回 false (hostname mismatch).
isResolvable(host)
如果成功解析主機名則返回true。參考如下:
- isResolvable("www.google.com") 返回 true (除非由于防火墻或某些其他原因導致DNS無法解析).
- isResolvable("bogus.domain.foobar") 返回 false.
isInNet(host, pattern, mask)
host 在這里可以是DNS主機名,比如www.google.com,也可以是IP地址。如果傳遞的是主機名,此函數會將其解析成 IP 地址。 pattern 是點分隔格式的 IP 地址模式。
mask 是IP地址模式掩碼,用于確定應對IP地址的哪些部分進行匹配。值為0表示忽略;255表示匹配。如果主機的IP地址與指定的IP地址模式匹配,則返回 true。參考如下:
- isInNet(host, "198.95.249.79", "255.255.255.255") 如果host的IP地址為198.95.249.79則返回 true.
- isInNet(host, "198.95.0.0", "255.255.0.0") 如果host的IP地址為198.95.*.*則返回 true.
dnsResolve(host)
host 是要解析的主機名。將給定DNS主機名解析成IP地址,并以點分隔格式的字符串形式將其返回。參考如下:
dnsResolve("www.google.com") 返回IP地址 "64.233.189.104".
myIpAddress()
此函數將以點分隔格式的字符串形式返回運行瀏覽器的那臺計算機的IP地址。
dnsDomainLevels(host)
返回url主機名中的DNS層數(圓點數)。參考如下:
dnsDomainLevels("www") 返回 0
dnsDomainLevels("www.google.com") 返回 2
shExpMatch(str, shexp)
str 是要比較的任何字符串(例如,url或主機名)。
shexp 是用以進行比較的shell表達式。如果字符串與指定的 shell 表達式匹配,則此表達式為 true。參考如下:
shExpMatch("http://www.apple.com/downloads/macosx/index.html", "*/macosx/*") 返回 true.
shExpMatch("http://www.apple.com/downloads/support/index.html", "*/macosx/*") 返回 false.
weekdayRange(wd1, wd2, gmt)
wd1 和 wd2 為以下任意一個星期日期字符串: SUN MON TUE WED THU FRI SAT, gmt 或者是字串 GMT 或者省略,前者表示格林威治標準時間,后者表示當地時間。 只有第一個參數wd1是強制性的。wd2、gmt 中的任一個或兩者皆可省略。如果只有一個參數,則此函數將在該參數所表示的星期日期返回true。如果指定字符串GMT作為第二個參數,則采用GMT時 間,否則采用當地時區的時間。如果wd1和wd2均被定義,則該條件在當前星期日期介于這兩個星期日期之間時為true。首末日期包括在內。參數順序很重 要;"MON," "WED" 指星期一到星期三,而 "WED," "MON" 是從星期三到下周的星期一。
weekdayRange("MON", "FRI") 從星期一到星期五(當地時區)為 true.
weekdayRange("MON", "FRI", "GMT") 從格林威治標準時間星期一到星期五為 true.
weekdayRange("SAT") 當地時間星期六為 true.
weekdayRange("SAT", "GMT") 格林威治標準時間星期六為 true.
weekdayRange("FRI", "MON") 從星期五到下星期一為 true (注意,順序很重要).
dateRange(day)
dateRange(day1, day2)
dateRange(mon)
dateRange(month1, month2)
dateRange(year)
dateRange(year1, year2)
dateRange(day1, month1, day2, month2)
dateRange(month1, year1, month2, year2)
dateRange(day1, month1, year1, day2, month2, year2)
dateRange(day1, month1, year1, day2, month2, year2, gmt)
day 每月1到31號中的任意一天(整數類型).
month 是如下表示月份的字符串中的一個:JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC, year 是表示年份的完整數字,例如1995(而不是95)。整數類型。
gmt 或者為字符串GMT,或者保留為空,前者將以格林威治標準時間進行時間比較,后者假定時間處于當地時區。盡管上 面表示的函數語法不是每一個都包含gmt參數,事實上可以在上述9個任一調用配置文件中指定gmt參數,不過,它始終都要作為最后一個參數。如果只指定了 單個值(對于每個類別:day、month、year),則此函數僅在與指定值匹配的日子才會返回true。如果指定了兩個值,則從指定的第一個時間到指 定的第二個時間,結果均為truee。首末日期包括在內。參考如下:
dateRange(1) 在當地時區每月的第一天為 true.
dateRange(1, "GMT") 在GMT時間每月的第一天為 true.
dateRange(1, 15) 在當地時區每月的1號到15號為 true.
dateRange(24, "DEC") 在當地時區每年12月24號為 true.
dateRange(24, "DEC", 1995) 在當地時區1995年12月24號為 true.
dateRange("JAN", "MAR") 在當地時區每年第一季度(1月到3月)為 true.
dateRange(1, "JUN", 15, "AUG") 在當地時區每年6月1號到8月15號為 true, 首末日期包括在內.
dateRange(1, "JUN", 15, 1995, "AUG", 1995) 在當地時區1995年6月1號到8月15號為 true, 首末日期包括在內.
dateRange("OCT", 1995, "MAR", 1996) 在當地時區1995年10月到1996年3月為 true.
dateRange(1995) 在當地時區1995年為 true.
dateRange(1995, 1997) 在當地時區1995年1月1號到1997年12月31號(1995年初到1997年底)為 true.
timeRange(hour)
timeRange(hour1, hour2)
timeRange(hour1, min1, hour2, min2)
timeRange(hour1, min1, sec1, hour2, min2, sec2)
timeRange(hour1, min1, sec1, hour2, min2, sec2, gmt)
hour 是0點(午夜12點)到23點(晚上11點)表示小時的數值中的一個。
min 是表示分鐘的0到59中的一個值。
sec 是表示秒鐘的0到59中的一個值。
gmt 同上文所述。
timerange(12)中午12點到下午1點之間為 true.
timerange(12, 13)同上例.
timerange(12, "GMT")在GMT時間中午12點到下午1點之間為 true.
timerange(9, 17)上午9點到下午5點之間為 true.
timerange(8, 30, 17, 00)上午8點30分到下午5點之間為 true.
timerange(0, 0, 0, 0, 0, 30)午夜0點到其后的30秒內為 true.
總結
- 上一篇: pac for linux,Ubuntu
- 下一篇: 如何区分电梯卡为id卡ic卡_如何分辨门