茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1664789 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
PIMG_00251.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

一網情深 : [轉貼]PAC script教學

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15766
[轉貼]PAC script教學

PAC script教學

PAC-File(Proxy Auto Config File),用中文來說就是proxy自動設定的設定檔

若您待在的機關、公司對外的網路都必須經過proxy(又稱應用層閘道)

身為使用者的你可能在瀏覽器裡面設定過proxy

身為管理者的你在公司裡面要將PC大量佈屬下去的時候一定也替PC設定過proxy

問題來了~

要是proxy有發生變動需要換位置(位置改變,機器掛掉),那不就要一台一台幫使用者改或是接電話接到手軟?這時候使用pac file的好處就來了,我們只需要管理一組proxy的組態並

將它用http的方式發佈,用戶端只需要設定好使用pac的方式去存取proxy組態

如果是針對不同的連線使用不同的proxy我們的pac file也可以做到(連A站用a proxy,連B站用b proxy,不經由proxy則直接連線)

又或者是常常因為工作環境常常變動必須一直變換proxy的人,我相信是需要這個東東的

最基本的pac file:

function FindProxyForURL(url,host)
{
  return “PROXY 你家的proxy :port”;
}

你家的proxy :port 這部分可以寫成:


test.com.tw:3128  或是

202.135.25.15:3128 也可以

注意,不需要加上http:// 喔!!!

 

複雜一點的pac file:


function FindProxyForURL(url, host)
{
if (isInNet(host, "192.168.0.0", "255.255.0.0")) {
return "DIRECT";           //若在private網路下不經由proxy直接連線
} else {
if (shExpMatch(url, "http:*"))
return "PROXY proxy1.example.com.tw:3128" ;   //http的連線使用proxy1.example.com.tw
if (shExpMatch(url, "https:*"))
return "PROXY proxy2.example.com.tw:3128" ; //https的連線使用proxy2.example.com.tw
if (shExpMatch(url, "ftp:*"))
return "PROXY proxy3.example.com.tw:3128" ; //ftp的連線使用proxy3.example.com.tw

return "DIRECT"; //除了以上的連線之外則直接連線
}
}

最後存成文字檔案或xxx.pac,放到http server上或是本機磁碟裡就可以使用囉

 


瀏覽器要如何設定載入pac file呢?

有2種載入方式,一種是將pac file放在http server中由網路存取

而另外一種是將pac file放在本機磁碟裡


firefox:由網路存取pac直接打網址就好,firefox很聰明會自動幫你補上前面http://的部分。若是要放在本機裡面使用則是 如下格式   file://c:/proxy.pac

firefox seting pac

IE:IE就不像firefox那麼聰明了,必須自己加上http://,否則無法生效。若是要本機存取一樣打上
file://c:/proxy.pac 的格式

ie setting pac

 

奇怪~為啥剛剛寫的pac file好像沒有生效

我們先在瀏覽器裡輸入剛剛寫的pac file的位置來測試看看

阿哩,原來是我們的.pac檔被apache當成MIME Type來處理了

所以當我們輸入檔案位置的時候被要求用甚麼程式來處理

這邊有2個解決辦法

1. pac檔名不要取成".pac"(這不是廢話嗎)

2. 在apache設定檔裡拿掉MIME Type的設定

    在ubuntu server上編輯/etc/mime.types

    註解掉以下這行

    application/x-ns-proxy-autoconfig              pac

    變成

     #application/x-ns-proxy-autoconfig              pac



原文出處:PAC script教學 @ A夢之IT可憐貓 :: 痞客邦 PIXNET ::
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15766
[轉貼]Proxy Server 的分流程式

Proxy Server 的分流程式( proxy.pac)

一、前言

如果你的對proxy server  log 檔做流量分析,結果排行榜的前幾名都是自己學校的網站,那網路的流量就有點浪費了;如果貴單位必須設上層的 Proxy Server ,那影響更大了,因為資料都由上層 Proxy Server 送來,即使瀏覽的是LOCAL 網站,快則由 local 的 proxy server 送來,慢則由上層 server 先到local 抓取,再送過來,等於是繞了一圈。

Squid 1.X 版時,有設定 local IP 和 local domain 的功能,2.X 版也有類似的設定,但一直試不出不抓網域內 網站的設定,所以、得靠分流程式;在一般較大的單位中,Proxy server 不只一台,這也得靠 分流程式的設定;總之,要發揮proxy server 的效能與有效控管,分流程式是最佳選擇。

二、環境設定

  1. 分流程式是由JavaScript Function 組成,預設的副檔名是 .pac ,一般都是用 proxy.pac 這個名字,它必需獨立,不能包含在 HTML 中,格式如下
    function FindProxyForURL(url, host)
    {
        ........
        ........
    }


  2. proxy.pac 要放在那裡呢? 你可以把它當成網頁,放在 web server 上,讓瀏覽器讀取。 例如我們把設定檔存成 proxy.pac,然後放在 一台執行 Apache 的 WEB SERVER (www.cses.tcc.edu.tw) 的首頁目錄,那麼我們在瀏覽器的設定就是:
       http://www.cses.tcc.edu.tw/proxy.pac
    也許你會產生疑問,proxy.pac 和 proxy server 不用在同一台電腦上嗎? 那誰又規定跑 squid 的 proxy server 也要執行 apache 。 ^_^
    那些 web server 支援呢? Netscape 、Apache、CERN、NCSA都可以,以Apache 為例,請檢查 httpd.conf 中是否有以下的設定,如果沒有就自己加上去吧! 
      Addtype application/x-ns-proxy-autoconfig .pac 

三、範例說明

一個一個function 來說明太麻煩了,就直接用例子來說明好了。

範例一:基本簡單型



function FindProxyForURL(url, host)
{
if (isPlainHostName(host) ||
dnsDomainIs(host, ".cses.tcc.edu.tw"))
return "DIRECT";
else
return "PROXY proxy.cses.tcc.edu.tw:3128; DIRECT";
}

說明:以我學校為例,在Browser 的 URL 欄位打 www 就會連到  www.cses.tcc.edu.tw,第一個 isPlainHostName(host) 就是處理這個部份,第二個部份 dnsDomainIs(host, ".cses.tcc.edu.tw") 就是處理 linux.cses.tcc.edu.tw 這種網址,這些網域都是 local 的網站,所以回應 DIRECT ,直接去抓就可以了。
如果不符以上情形,那就是透過 proxy.cses.tcc.edu.tw:3128 去抓資料,後面加上  DIRECT 是怕 PROXY 當了,也可以直接抓取。

註:也許會覺得奇怪,PROXY 當了,就讀不到這個proxy.pac 了,那設定有用嗎?  沒有人規定proxy.pac 要放在 proxy server 上,不同的 server 是可以的,只要 web server 支援。
 

範例二:多了 IP 的判斷

function FindProxyForURL(url, host)
    {
        if (isPlainHostName(host) ||

            dnsDomainIs(host, ".cses.tcc.edu.tw") ||
          isInNet(host, "163.17.208.0", "255.255.255.0"))
            return "DIRECT";
        else
            return "PROXY proxy.cses.tcc.edu.tw:3128; DIRECT";
    }

說明:這一個例子只是比上例多一個檢查 IP 的動作,只要是連往 163.17.208.x/24 也都直接存取。

範例三:LOCAL 、特殊網站、其他三種情形

function FindProxyForURL(url, host)
    {

        if (isPlainHostName(host) ||
            dnsDomainIs(host, ".cses.tcc.edu.tw") ||
          isInNet(host, "163.17.208.0", "255.255.255.0"))
        return "DIRECT";
        

        if (dnsDomainIs(host, ".edu.tw"))
      return "PROXY cache2.nchu.edu.tw:3128;" +  
                "PROXY cache1.nchu.edu.tw:3128";
        else

       return "PROXY proxy.cses.tcc.edu.tw:3128";
    }

說明:因為 CODERED 的關係,中興大學對 80 PORT 的流量做管制,必需經過 proxy server ,所以,所有的教育網站都經過 proxy server ,興大提供 cache1 cache2 兩台 server ,是 edu.tw 的網站都要透過特定的 巨server , 要注意的是兩台 PROXy SERVER 的寫法。

我的設定:

function FindProxyForURL(url, host)
    { # 自己學校的網域、IP 、縣網、縣網 IP 還有電子公文
# 的專屬網站都直接存取,不經過 PROXY SERVER 

          if (isPlainHostName(host) ||
          dnsDomainIs(host, ".cses.tcc.edu.tw") ||

            dnsDomainIs(host, ".boe.tcc.edu.tw") ||
             localHostOrDomainIs(host, "eod.taichung.gov.tw") ||
          isInNet(host, "163.17.208.0", "255.255.255.0") ||
          isInNet(host, "163.17.40.0", "255.255.255.0"))
       return "DIRECT";
# 到 台中縣的中、小學都經過 PROXY,不然又繞到中興就太
# 慢了,也可以把上面的 boe 去掉,那就是直接存取,
# 但是我覺得,國中、小的頻寬都不高,還是經過 PROXY 
# 比較好。

         if (dnsDomainIs(host, ".tcc.edu.tw"))

                return "PROXY proxy.cses.tcc.edu.tw:3128";
# 經過上面的過濾, 其他的教育單位就經由中興大學了。
         if (dnsDomainIs(host, ".edu.tw"))
         return "PROXY cache2.nchu.edu.tw:3128;" + 
                "PROXY cache1.nchu.edu.tw:3128";
       else
# 如果都不是、那就由本校的 proxy 出去了。
             return "PROXY proxy.cses.tcc.edu.tw:3128";
     }

四、後記


小程式我會寫,但是JavaScript沒碰過,如果怕語法有錯,推薦一套編輯器 http://www.editplus.com/  管它什麼  HTML, ASP, PHP, Perl, VBScript, JavaScript, CSS files,  C/C++, Java, JSP, SQL, Pascal, Python 通通支援,只要下載它的 語法檔或控制檔,檔案都小的,不過它沒有 巨集的功能。

參考資料


原文出處:Proxy Server 的分流程式
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15766
[轉貼]Proxy.pac:自動組態設定檔/自動設定網址 Proxy Autoconfig
Proxy.pac:自動組態設定檔/自動設定網址 Proxy Autoconfig


原文: http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html

(譯註:這份文件可能很舊,但大部分內容應該還是適用,我簡單翻譯+整理如下)

翻譯摘要如下:


Proxy 自動組態設定檔(Proxy AutoConfig File)是由 Javascript 檔寫成,可以放在本地或遠端

自動組態設定檔必須包含此 function




        function FindProxyForURL(url, host)

        {

            ...

        }






當所有 URL 在存取時,若有設定「自動組態設定檔」,便執行此 fucntion,獲得回傳值




        ret = FindProxyForURL(url, host);






這裡的 URL 是瀏覽器網址 URL
這裡的 host 是由 URL 所取出的 hostname
這裡的 ret 是回傳值,描述處理後的值



自動組態設定檔格式與 MIME 設定
1. 副檔名通常是 .pac,通常我們會取名為 proxy.pac 或 autoproxy.pac
2. 部份的伺服器需要針對 .pac 設定適當的 MIME Type Mapping
如:application/x-ns-proxy-autoconfig



回傳格式
1. 回傳 ret 的值是字串
2. 若 ret 的字串是 NULL,瀏覽器就不需處理,直接連結
3. 回傳的字串分成下列三種分類:

(a) DIRECT => 代表直接連結
(b) PROXY host:port => 代表應該使用指定的 host 和 port 作為此 URL 的 Proxy Server
(c) SOCKS host:port => 代表應該使用指定的 host 和 port 作為此 URL 的 SOCKS4/5 Server

若回傳的 PROXY host:port 有多筆,則瀏覽器會先由第一筆開始嘗試連結,
若失敗,接著第二筆...。

例如:




PROXY proxy.vovo2000.com:8080; PROXY proxy2.vovo2000.com:8080





代表 會先用 proxy.vovo2000.com,如果該 proxy 失效,則連結 proxy2.vovo2000.com





PROXY proxy.vovo2000.com:8080; PROXY proxy2.vovo2000.com:8080; DIRECT





同上面的例子,但是如果前兩個 proxy 都無法使用,則直接連結(DIRECT)



下面是幾個 Javascirpt Function 可用於 Proxy.pac 自動組態設定檔




    * Hostname 相關函式

          - isPlainHostName()

          - dnsDomainIs()

          - localHostOrDomainIs()

          - isResolvable()

          - isInNet()

         

    * 相關 DNS/IP 工具函式

          - dnsResolve()

          - myIpAddress()

          - dnsDomainLevels()

         

    * URL/hostname 相關相關函式

          - shExpMatch()

         

    * 時間函式

          - weekdayRange()

          - dateRange()

          - timeRange()

         

    * Bindings

          - ProxyConfig.bindings






isPlainHostName(host)

@host: URL 內的「純」hostname (no port #)

範例:




isPlainHostName("www")





=> 回傳 true.





isPlainHostName("www.vovo2000.com")





=> 回傳 false


dnsDomainIs(host, domain)

@host: hostname
@domain: domain name 是否是 hostname 的 domain


   

dnsDomainIs("www.vovo2000.com", ".vovo2000.com")





=> 回傳 true.





dnsDomainIs("www", ".vovo2000.com")

dnsDomainIs("www.microsoft.com", ".vovo2000.com.com")





=> 這兩者都是 false

localHostOrDomainIs(host, hostdom)

@host: hostname
@hostdom: 代測試 hostdom


回傳 True 如果: (a) host == hostdom (b) host 為 nodomain-name 的 hostname 且 match hostdom




localHostOrDomainIs("www.vovo2000.com", "www.vovo2000.com")

localHostOrDomainIs("www", "www.vovo2000.com")



localHostOrDomainIs("www.microsoft.com", "www.vovo2000.com")

localHostOrDomainIs("mail.vovo2000.com", "www.vovo2000.com")





=> 前兩者 True, 後兩者 false


isResolvable(host)

@host: hostname from URL





isResolvable("vovo2000.com")

isResolvable("nonohihijaja1234.vovo2000.mars")





=> 看 DNS 是否可以解析 hostname:前者 true。後者大概火星才找的到 false 回傳



isInNet(host, pattern, mask)

@host: DNS hostname 或 IP address
@pattern: IP Address 格式
@mask: IP Address Mask, 0: ignore, 255 match

簡單的來說就是看是否 host 在 pattern + mask 的定義範圍內
host 可為 hostname 或 ip address





isInNet(host, "198.95.249.79", "255.255.255.255")





=> 如果 host 是 198.95.249.79 則回傳 true



   

isInNet(host, "198.95.0.0", "255.255.0.0")





=> 如果 host 是 198.95.*.* 則回傳 true


dnsResolve(host)

@host: hostname

轉 hostname 為 IP address





dnsResolve("vovo2000.com")





=> 回傳 210.66.XXX.XXX

myIpAddress()

回傳瀏覽器所執行的 IP Address





myIpAddress()





=> 回傳您的 IP Address


dnsDomainLevels(host)

@host: hostname

回傳 hostname 有幾個 dot(domain name level)





dnsDomainLevels("www")

dnsDomainLevels("mail.vovo2000.com")





=> 分別回傳 0 和 2


shExpMatch(str, shexp)

@str: URL/hostname 字串
@shexp: Shell Express 比較 pattern

看是否 URL/hostname == shexp





shExpMatch("http://vovo2000.com/paintbbs/", "*/paintbbs/*")





=> 因為 hostname 有 /paintbbs/ 所以回傳 true





shExpMatch("http://vovo2000.com/paintchat/", "*/paintbbs/*")





=> hostname 沒有 /paintbbs/ 回傳 flase



weekdayRange(wd1, wd2, gmt)

@wd1: SUN MON TUE WED THU FRI SAT 七個 week day(必要欄位)
@wd2: SUN MON TUE WED THU FRI SAT 七個 week day(非必要欄位)
@gmt: GMT 或空白 (非必要欄位),此欄位若不定義則為本地時區

判斷「目前時間」是否在此 Range 內



   

weekdayRange("MON", "FRI")

weekdayRange("MON", "FRI", "GMT")

weekdayRange("SAT")

weekdayRange("SAT", "GMT")

weekdayRange("FRI", "MON")





=> return true 如果在上述時間範圍內,適用於「以 weekday」為範圍的日期判斷


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: 年,必須為四位數 e.g. 2007
@gmt: GMT 或 localtime

一樣是作為日期判斷,但是可明確指出「年、月、日」範圍

範例:




dateRange(1)

dateRange(1, "GMT")

dateRange(1, 15)

dateRange(24, "DEC")

dateRange(24, "DEC", 2007)

dateRange("JAN", "MAR")

dateRange(1, "JUN", 15, "AUG")

dateRange(1, "JUN", 15, 2007, "AUG", 2007)

dateRange("OCT", 2006, "MAR", 2007)

dateRange(2007)

dateRange(2006, 2007)







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~23 (0 是午夜 12:00)
@min: 分鐘 0~59
@sec: 秒 0~59
@gmt: GMT 或 localtime

利用 timeRange 和 weekdayRange / dateRange 可精確定義出時間

範例:




timerange(12)

timerange(12, 13)

timerange(12, "GMT")

timerange(9, 17)

timerange(8, 30, 17, 00)

timerange(0, 0, 0, 0, 0, 30)














範例 1:如果 *.vovo2000.com 相關的網址則直接連結,其他網址都使用 proxy.vovo2000.com 來連線




    function FindProxyForURL(url, host)

    {

        if (isPlainHostName(host) ||

            dnsDomainIs(host, ".vovo2000.com"))

            return "DIRECT";

        else

            return "PROXY proxy.vovo2000.com:8080; DIRECT";

    }






範例 1b:同範例 1,但如果 local 的 host 是 FTP 和 mail,則還是要透過 Proxy




    function FindProxyForURL(url, host)

    {

        if ((isPlainHostName(host) ||

             dnsDomainIs(host, ".vovo2000.com")) &&

            !localHostOrDomainIs(host, "mail.vovo2000.com") &&

            !localHostOrDoaminIs(host, "ftp.vovo2000.com"))



            return "DIRECT";

        else

            return "PROXY proxy.vovo2000.com:8080; DIRECT";

    }








範例 2:除非 DNS 無法解析這個 hostname,否則都直接連;無法解析的都透過 proxy




    function FindProxyForURL(url, host)

    {

        if (isResolvable(host))

            return "DIRECT";

        else

            return "PROXY proxy.vovo2000.com:8080";

    }






範例 2a:上面這種可能每次都要 query DNS,可透過一些 rule combo 來讓 DNS query 次數減少




    function FindProxyForURL(url, host)

    {

        if (isPlainHostName(host) ||

            dnsDomainIs(host, ".vovo2000.com") ||

            isResolvable(host))

            return "DIRECT";

        else

            return "PROXY proxy.vovo2000.com:8080";

    }






範例 3:使用 isInNet 的 Subnet 判斷式,讓 Subnet 198.95.*.* 內的直接連,其他的透過 Proxy




    function FindProxyForURL(url, host)

    {

        if (isInNet(host, "198.95.0.0", "255.255.0.0"))

            return "DIRECT";

        else

            return "PROXY proxy.vovo2000.com:8080";

    }






範例 3a:配合其他 rule 讓 host 解析次數減少




    function FindProxyForURL(url, host)

    {

        if (isPlainHostName(host) ||

            dnsDomainIs(host, ".vovo2000.com") ||

            isInNet(host, "198.95.0.0", "255.255.0.0"))

            return "DIRECT";

        else

            return "PROXY proxy.vovo2000.com:8080";

    }






範例 4:利用 shExpMatch 達成 Proxy Balancing 的功能




    function FindProxyForURL(url, host)

    {

        if (isPlainHostName(host) || dnsDomainIs(host, ".vovo2000.com"))

            return "DIRECT";

        else if (shExpMatch(host, "*.com"))

            return "PROXY proxy1.vovo2000.com:8080; " +

                   "PROXY proxy4.vovo2000.com:8080";

        else if (shExpMatch(host, "*.edu"))

            return "PROXY proxy2.vovo2000.com:8080; " +

                   "PROXY proxy4.vovo2000.com:8080";

        else

            return "PROXY proxy3.vovo2000.com:8080; " +

                   "PROXY proxy4.vovo2000.com:8080";

    }





=> 外部需要 Proxy:如果是 *.com 則用 Proxy1,如果是 *.edu 則用 proxy2,其他 .net/.org./.tw/.jp/.cn/... 則用 proxy3
=> 而 proxy4 是各種 routes 的 backup proxy
=> 這個寫法可以在各個 routes 後面加上 DIRECT,如果 proxy 都失效或需要維護時

範例 5:和範例 4 類似,不過這是用 Protocol 來分類作 Balancing




        function FindProxyForURL(url, host)

        {

            if (url.substring(0, 5) == "http:") {



                return "PROXY proxy1.vovo2000.com:8080; DIRECT";

            }

            else if (url.substring(0, 4) == "ftp:") {



                return "PROXY proxy2.vovo2000.com:8080; DIRECT";

            }

            else if (url.substring(0, 4) == "mms:") {



                return "PROXY proxy3.vovo2000.com:8080; DIRECT";

            }

            else if (url.substring(0, 6) == "https:" ||

                     url.substring(0, 6) == "snews:") {



                return "PROXY proxy4.vovo2000.com:8080; DIRECT";

            }

            else {

                return "DIRECT";

            }

        }





=> HTTP 使用 proxy1,FTP 使用 proxy2,mms 使用 proxy3,https 使用 proxy4
=> 上述的 substring 一樣可用 if (shExpMatch(url, "http:*")) 來達成


提示:
1. AutoConfig Proxy.pac 一樣可用 php/cgi 等方式 output 達成更好的輸出方式

原文出處: Proxy.pac:自動組態設定檔/自動設定網址 語法 - proxy,pac,自動組態設定
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15766
[轉貼]Proxy 自動設定範例 (Windows)
Proxy 自動設定範例

這些範例是使用 Proxy 自動設定 (.pac) 檔指定自動 Proxy URL 的各種方法。若要使用這些範例,您必須將 Proxy 名稱、連接埠號碼及 IP 位址更改為與公司資訊相同的值。

本機主機直接連線
在此範例中,如果是本機主機,則它可以直接連線。不過,如果它不是本機伺服器,則它必須透過 Proxy 伺服器連線。具體而言,isPlainHostName 函式會檢查主機名稱是否有任何句點 (或點)。如果函式找到點,這代表它不是本機主機並會傳回 false。否則,函式會傳回 true。
function FindProxyForURL(url, host)
 {
 if (isPlainHostName(host))
 return "DIRECT";
 else
 return "PROXY proxy:80";
 }

如果主機位於防火牆內便會直接連線
在這個範例中,如果主機位於防火牆內部,它便可以直接連線。不過,如果伺服器位於防火牆外部,則它必須透過 Proxy 伺服器連線。具體而言,localHostOrDomainIs 函式只會執行本機網域中的 URL。如果主機網域名稱符合所提供的網域資訊,則 dnsDomainIs 函式會傳回 true。
function FindProxyForURL(url, host)
 {
 if ((isPlainHostName(host) ||
 dnsDomainIs(host, ".company.com")) &&
 !localHostOrDomainIs(host, "www.company.com") &&
 !localHostOrDoaminIs(host, "home.company.com"))
 return "DIRECT";
 else
 return "PROXY proxy:80";
}

如果是可解析的主機名稱便會直接連線
在這個範例中,如果可以解析主機名稱,它便可以直接連線。不過,如果無法解析名稱,則伺服器必須透過 Proxy 伺服器連線。明確的說,此函式會要求 DNS 伺服器解析傳送給它的主機名稱。如果可以,會進行直接連線。如果不可以,則會使用 Proxy 進行連線。
當內部 DNS 伺服器用來解析所有內部主機名稱時,它會非常有用。
重要
isResolvable 函式會查詢網域名稱系統 (DNS) 伺服器。物件模型物件、屬性或方法的參考會造成 Proxy 自動設定檔以無訊息模式失敗。例如,參考 window.open(...)、alert(...) 和 password(...) 都會造成 Proxy 自動設定檔失敗。
function FindProxyForURL(url, host)
 {
 if (isResolvable(host))
 return "DIRECT";
 else
 return "PROXY proxy:80";
 }

如果主機位於指定的子網路內部便會直接連線
在這個範例中,如果本機位於指定的子網路內部,它便可以直接連線。不過,如果伺服器位於指定的子網路外部,則它必須透過 Proxy 伺服器連線。具體而言,如果主機的 IP 位址符合指定的模式,isInNet (主機、模式、遮罩) 函式便會傳回 true。遮罩會指出要比對的 IP 位址部分 (255 = 符合,0 = 略過)。
重要
isInNet 函式會查詢 DNS 伺服器。物件模型物件、屬性或方法的參考會造成 Proxy 自動設定檔以無訊息模式失敗。例如,參考 window.open(...)、alert(...) 和 password(...) 都會造成 Proxy 自動設定檔失敗。
function FindProxyForURL(url, host)
 {
 if (isInNet(host, "999.99.9.9", "255.0.255.0"))
 return "DIRECT";
 else
 return "PROXY proxy:80";
 }

根據主機網域決定連線類型
在這個範例中,如果是本機主機,則伺服器可以直接連線。不過,如果不是本機主機,則這個函式會根據主機網域判斷要使用的 Proxy。具體而言,如果使用 Shell 運算式模式時,str 符合 shexp,則 shExpMatch(str, shexp) 函式會傳回 true。
當主機網域名稱是 Proxy 選項的其中一個條件時,這就非常有用。
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";
 }

根據通訊協定決定連線類型
在這個範例中,使用中通訊協定會擷取自伺服器並可用來選擇 Proxy。如果找不到符合的通訊協定,則伺服器會直接連線。具體而言,substring 函式會從字串中擷取指定的字元數。
當通訊協定是 Proxy 選項的其中一個條件時,這就非常有用。
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";
      }
 }

根據符合 IP 位址的主機名稱決定 Proxy 伺服器
在這個範例中,透過將主機名稱轉譯成 IP 位址,然後將該位址與指定的字串進行比較的方式來選取 Proxy 伺服器。
重要
dnsResolve 函式會查詢 DNS 伺服器。物件模型物件、屬性或方法的參考會造成 Proxy 自動設定檔以無訊息模式失敗。例如,參考 window.open(...)、alert(...) 和 password(...) 都會造成 Proxy 自動設定檔失敗。
function FindProxyForURL(url, host)
 {
 if (dnsResolve(host) == "999.99.99.999") { // = http://secproxy
 return "PROXY secproxy:8080";
 }
 else {
 return "PROXY proxy:80";
 }
 }

如果主機 IP 位址與指定的 IP 位址相符,則使用 Proxy 伺服器進行連線
在這個範例中,透過明確取得 IP 位址,然後將該位址與指定的字串進行比較的方式來選取 Proxy 伺服器。如果找不到符合的通訊協定,則伺服器會建立直接連線。具體而言,myIpAddress 函式會傳回執行瀏覽器的主機 IP 位址 (以整數點格式表示)。
function FindProxyForURL(url, host)
 {
 if (myIpAddress() == "999.99.999.99") {
 return "PROXY proxy:80";
 }
 else {
 return "DIRECT";
 }
 }

如果主機名稱包含點,則使用 Proxy 伺服器進行連線
在這個範例中,函式會檢查主機名稱是否有句點 (或點)。如果有任何點存在,就會使用 Proxy 伺服器進行連線。如果不含任何點,就會進行直接連線。具體而言,dnsDomainLevels 函式會傳回等於主機名稱中的點數目的整數。
注意
這是根據主機名稱特性決定連線類型的另一種方式。
function FindProxyForURL(url, host)
 {
 if (dnsDomainLevels(host) > 0) { // if the number of dots in host > 0
 return "PROXY proxy:80";
 }
 return "DIRECT";
 }

根據一週的特定天數使用 Proxy 伺服器進行連線

在這個範例中,函式會根據每週天數判斷是否要連線到 Proxy 伺服器。在指定期間以外的日期連線參數會讓伺服器建立直接連線。具體而言,weekdayRange(day1 [,day2] [,GMT] ) 函式會透過 day1、day2 和 GMT 參數,傳回目前系統時間是否落在指定的範圍內。只需要第一個參數即可。GMT 參數會假設時間值會使用格林威治標準時間,而不是本地時區。
當您要在流量很大時使用 Proxy 伺服器,但在流量很小時允許直接連線的情況下,此函式非常有用。
function FindProxyForURL(url, host)
 {
 if(weekdayRange("WED", "SAT", "GMT"))
 return "PROXY proxy:80";
 else
 return "DIRECT";
 }


原文出處:Proxy 自動設定範例 (Windows)
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|