传回值的格式
FindProxyForURL 将会传回一个单一字串。假如该字串为空字串,则表示浏览器不使用 Proxy 伺服器。
传回值格式如下
DIRECT
直接连线不透过 Proxy 伺服器
PROXY host:port
使用 host 当作 proxy 伺服器
Example 1:
PROXY w3proxy.netscape.com:8080; PROXY mozilla.netscape.com:8081
第一个 PROXY 伺服器为 w3proxy:8080 如果第一个 PROXY 伺服器当机将会使用第二个 PROXY 伺服器直到第一个 PROXY 伺服器再度启动。
【注】
假如有多个代理伺服器设定同时存在,则最左边的设定将第一个使用,直
到浏览器无法建立连线才会更换到第二个设定。而浏览器将会在30分钟后
自动对於先前无回应的 PROXY 伺服器重新连线。而浏览器将会於一个小时
后自动再连线一次(每一次的重新连线都会增加30分钟)。
Example 2:
PROXY aa1.bbb.ccc:8080; PROXY aa2.bbb.ccc:8081; DIRECT
与上面的范例相同,只是当两个 PROXY 伺服器都当掉了将会自动直接存取
。在第一个范例中,当两个 PROXY 都当掉了,浏览器将会询问是否要直接
存取,在第二个范例中则不会询问。
【注】
如果说所有的 PROXY 伺服器都当掉了,也没有将 DIRECT 设定在 .pac 档
案,那麽浏览器在尝试建立连线 20 分钟后将会询问是否要暂时忽略 Proxy
服器直接存取网路,下一次询问的时间则是在 40 分钟后(注意!每一次
询问都会增加20分钟)
范例
范例 1:除了本地网站外其他的网站均使用 Proxy
以高雄县网中心网域为例
function FindProxyForURL(url, host)
{
if (isPlainHostName(host) ||
dnsDomainIs(host, ".ks.edu.tw"))
return "DIRECT";
else
return "PROXY 140.127.79.8:80; DIRECT";
}
Note: This is the simplest and most efficient autoconfig file
for cases where there's only one proxy.
范例 2: 对於无法反解析的 Host 才进行 Proxy 存取
function FindProxyForURL(url, host)
{
if (isResolvable(host))
return "DIRECT";
else
return "PROXY proxy.mydomain.com:8080";
}
注意!!上面的方式将会使每一次连线都对 DNS server 进行确定的动
作,会浪费网路频宽,可以改用下列方式改善:
function FindProxyForURL(url, host)
{
if (isPlainHostName(host) ||
dnsDomainIs(host, ".mydomain.com") ||
isResolvable(host))
return "DIRECT";
else
return "PROXY proxy.mydomain.com:8080";
}
范例 3: 判断子网域
判断远端网站是否在某一个子网域中,如果是则直接存取,其他网站仍
然透过代理伺服器做存取动作。
function FindProxyForURL(url, host)
{
if (isInNet(host, "198.95.0.0", "255.255.0.0"))
return "DIRECT";
else
return "PROXY proxy.mydomain.com:8080";
}
此外也可以利用网域名称来判断是否要经过 Proxy Server
function FindProxyForURL(url, host)
{
if (isPlainHostName(host) ||
dnsDomainIs(host, ".mydomain.com") ||
isInNet(host, "198.95.0.0", "255.255.0.0"))
return "DIRECT";
else
return "PROXY proxy.mydomain.com:8080";
}
范例 4: 负载平衡
如果有 4 台 Proxy server 有下列的用途
Proxy 负责区域
#1 .com 网域
#2 .edu 网域
#3 剩下的网欲
#4 备援机器
而所有的近端区域的网站都「直接存取」,则自动组态档可以写成:
function FindProxyForURL(url, host)
{
if (isPlainHostName(host) ||
dnsDomainIs(host, ".mydomain.com"))
return "DIRECT";
else if (shExpMatch(host, "*.com"))
return "PROXY proxy1:8080; " +"PROXY proxy4:8080";
else if (shExpMatch(host, "*.edu"))
return "PROXY proxy2:8080; " +"PROXY proxy4:8080";
else
return "PROXY proxy3:8080; " +"PROXY proxy4:8080";
}
范例 5: 针对某个协定使用 Proxy
对於http协定的网站使用 http-proxy.mydomain.com:8080
对於ftp协定的网站使用 fttp-proxy.mydomain.com:8080
对於gopher协定的网站使用 gopher-proxy.mydomain.com:8080
对於https协定或是news协定的网站使用security-proxy.mydomain.com:8080
其他的则是直接存取
注意!! substring()是JavaScript内建的字串函数
function FindProxyForURL(url, host)
{
if (url.substring(0, 5) == "http:") {
return "PROXY http-proxy.mydomain.com:8080";
}
else if (url.substring(0, 4) == "ftp:") {
return "PROXY ftp-proxy.mydomain.com:8080";
}
else if (url.substring(0, 7) == "gopher:") {
return "PROXY gopher-proxy.mydomain.com:8080";
}
else if (url.substring(0, 6) == "https:" ||
url.substring(0, 6) == "snews:"){
return "PROXY security-proxy.mydomain.com:8080";
}
else {
return "DIRECT";
}
}