IE自动通过代理服务器访问某些网站

翟二喜

Auto Proxy Config 自动通过代理服务器访问某些网站:

在C盘根目录下新建文件proxy.pac,用写字板写入如下内容:
function FindProxyForURL(url, host)
{
if (dnsDomainIs(host, ".acs.org"))
return "PROXY 10.1.1.20:8080; DIRECT";
else if (dnsDomainIs(host, ".nature.com"))
return "PROXY 10.1.1.2:80; DIRECT";
else
return "DIRECT";
}
在浏览器中,菜单"工具"-"Internet选项"-"连接"-"局域网设置",不勾"自动检测设置"和"为LAN使用代理服务器。。",勾上"使用自动配置脚本",在地址后面填上file://c:\proxy.pac

proxy.pac称为自动代理配置文件,是用Javascript写的脚本。上面的例子有如下功能:当访问任何网址中含有acs.org的网站时,浏览器将自动通过代理10.1.1.20:8080访问;当访问任何网址中含有nature.com的网站时,浏览器将自动通过代理10.1.1.2:80访问。如果这两个代理链接不上,访问以上两种网站将不通过代理服务器(直接连接),如果是访问其他的网站,直接连接。

关于自动代理配置文件的其他写法,可以参考下面的内容:
Proxy Auto Config檔的語法 II (來自微軟的說明文件)

前陣子整理了一篇PAC語法的文章(這裡)
今天在找另一個課題的解決之道時
無意中看到微軟"Internet Explorer維護"的說明文件也有介紹

功能強大卻又簡單清楚
特別是洋洋灑灑10個範例
相當具有參考價值


JavaScript 或 JScript 自動 Proxy 範例檔

下面的指令檔提供如何使用 .pac 檔指定自動 Proxy URL 的範例。若要使用這些函數,您必須變更 Proxy 伺服器的名稱、連接埠號碼和 IP 位址。
注意事項

  • isInNet()、isResolvable() 及 dnsResolve() 函數可查詢 DNS 伺服器。
  • 對「物件模型」物件、內容或方法的參照會導致 Proxy 伺服器自動設定檔無法執行。例如,window.open(...)、alert(...) 和 password(...) 的參照會導致 Proxy 自動設定檔無法在 Internet Explorer 上執行。

範例一:近端主機直接連線,其他所有電腦則透過 Proxy 伺服器連線

下列函數會檢查主電腦名稱是否為本端主機,如果是,則會檢查是否為直接連線。如果主機名稱不是本端主機,則連線是透過 Proxy (proxy)。

function FindProxyForURL(url, host)
  {
if (isPlainHostName(host))
return "DIRECT";
else
return "PROXY proxy:80";
  }

isPlainHostName() 函數會檢查主機名稱中是否有句點。如果有,則傳回 false。否則傳回 true。

範例二:防火牆內的主機直接連線,近端伺服器外的主機透過 Proxy 伺服器連線

下面的函數將檢查主機名稱中是否為「簡單」主機名稱 (即不包含網域名稱),還是非 www 或 home 主機名稱的特定網域 (.company.com) 一部分。

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";
  }

注意事項

  • localHostOrDomainIs() 函數的執行只限於區域網域中的 URL。
  • 如果主機名稱中的網域名稱與所給的網域名稱相符,則 dnsDomainIs 函數傳回 True。

範例三:如果主機是可解析的,則為直接連線。否則為透過 Proxy 連線

下面的函數會要求 DNS 伺服器解析所傳遞的主機名稱。如果可以,則建立直接連線。如果不可以,則透過 Proxy 伺服器建立連線。若要使用內部 DNS 伺服器辨識所有的內部主機名稱,可使用本函數。

function FindProxyForURL(url, host)
  {
if (isResolvable(host))
return "DIRECT";
else
return "PROXY proxy:80";
  }

有關 isResolvable() 函數的注意事項,請參閱本頁開始部分。

範例四:如果主機是在指定的子網路中,則為直接連線。否則為透過 Proxy 連線

下面的函數會將所給的 IP 位址模式和遮罩與主機名稱相比較。若要讓子網路中的某些主機直接連線,而其他主機則透過 Proxy 伺服器連線,可使用本函數。

function FindProxyForURL(url, host)
  {
if (isInNet(host, "999.99.9.9", "255.0.255.0"))
return "DIRECT";
else
return "PROXY proxy:80";
  }

有關 isInNet() 函數的注意事項,請參閱本頁開始部分。
如果主機的 IP 位址與指定的模式相符,函數 isInNet(host, pattern, mask) 傳回 True。遮罩會標示 IP 位址相符的部分 (255=相符,0=略過)。

範例五:根據主機網域決定連線類型

如果主機位於近端,下面的函數將指定建立直接連線。如果主機不位於近端,該函數將依據主機所在的網域,決定使用哪個 Proxy 伺服器。如果主機的網域名稱是選擇 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";
  }

如果使用 Shell 表示式模式時,str 與 shexp 相符,則 shExpMatch(str、shexp) 函數會傳回 True。

範例六:根據將使用的通訊協定決定連線類型

下面的函數會擷取所使用的通訊協定,並依據它選擇 Proxy 伺服器。如果無法搭配通訊協定,則直接連線。如果將使用的通訊協定是選擇 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";
	  }
  }

substring 函數從字串中提取指定數目的字元。

範例七:檢查主機名稱是否符合 IP 位址來決定 Proxy 設定

下面的函數將主機名稱轉換為 IP 位址,並將它與指定的字串相比較,以選擇 Proxy 伺服器。

function FindProxyForURL(url, host)
  {
	  if (dnsResolve(host) == "999.99.99.999") { // = http://secproxy
		return "PROXY secproxy:8080";
	  }
	  else {
		return "PROXY proxy:80";
	  }
  }

有關 dnsResolve() 函數的注意事項,請參閱本頁開始部分。

範例八:如果主機的 IP 位址與指定的 IP 位址相符合,則透過 Proxy 連線。否則直接連線

下面的函數是透過指定 IP 位址選擇 Proxy 伺服器的另一種方式。與範例七不同的是,它採用函數呼叫的方式,明確取得數位表示的 IP 位址 (範例七用 dnsResolve() 函數將主機名稱轉化為數字表示的 IP 位址)。

function FindProxyForURL(url, host)
  {
	  if (myIpAddress() == "999.99.999.99") {
		return "PROXY proxy:80";
	  }
	  else {
		return "DIRECT";
	  }
  }

myIpAddress() 函數會傳回正在執行瀏覽器的主機 IP 位址 (以整數加句點的格式)。

範例九:如果主機名稱中有任何句點,則透過 Proxy 連線。否則為直接連線

下面的函數用於查看主機名稱中有多少英文句號。如果主機名稱中有句點,則透過 Proxy 伺服器建立連線。如果主機名稱中沒有句點,則直接建立連線。這是依據主機名稱的型式確定連線類型的另一種方式。

function FindProxyForURL(url, host)
  {
	  if (dnsDomainLevels(host) > 0) { // if the number of dots in host > 0
		return "PROXY proxy:80";
	  }
		return "DIRECT";
  }

dnsDomainLevels() 函數會傳回一個代表主機名稱句點個數的整數。

範例十:指定每週哪幾天透過 Proxy 伺服器建立連線,其餘直接建立連線

下面的函數透過指定每週有哪些天使用 Proxy 伺服器連線來決定連線類型。不在這些參數之間的那幾天將直接進行連線。若要在網路資料流量過大時使用 Proxy 伺服器,而在網路資料流量減少時進行直接連線,則可使用本函數。

function FindProxyForURL(url, host)
  {
	if(weekdayRange("WED", "SAT", "GMT"))
	 return "PROXY proxy:80";
	else
	 return "DIRECT";
  }

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  0   博主  0

  1. IDCMart 0

    嗯,谢谢分享,回去一个一个的研究