2023年11月25日发(作者:)

/cayrus/blog/item/

【转】 自动切换IE代理设置: 简单使用IE自动配置脚本

因为工作需要,经常需要在家里和办公场所使用同一台电脑,由于家里不需要设

置浏览器的代理,而在办公场所就需要设置。所以每次都需要修改,WINDOWS7

之前一直使用IBM版本的Access Connections(以下简称AC来切换网络设置,

很强大,很方便,但遗憾的是IBM版本的AC不支持WIN7,而ThinkpAdvantage

系列的AC是有名的臭名昭著——会导致开机缓慢。下了几个IP切换软件,却都

少有IE代理切换功能,IPHELPER倒是提供IE代理配置,但公司网中使用的是

“IE自动配置脚本”,设定了对内网访问时不使用代理,连接外网时才使用代

理。无奈之下深入研究了一下这个IE自动配置脚本的原理,发现原来它就可以

实现我所需要的功能(当然IP地址切换功能除外,但提供这个功能的小软件海

了去了~),使用IE自动配置脚本,就可以不用每次在单位和家之间手动设置

IE代理了~只需要加上一行代码即可~(当然这行代码来之不易,其实学过计算

机二级考过了C语言的童鞋们只要静下心来看一看下面的介绍,应该就对IE

动配置脚本一清二楚了~

1. 什么是IE自动配置脚本

IE自动配置脚本起的作用就是,IE访问网页的时候会根据脚本文件里面界定

的内容来访问。比方说,你在脚本文件里面限定了访问某些IP使用某个代理的

时候,访问另外一些IP使用另外的代理,这就很方便通过脚本文件来完成。

2. 如何创建、编辑IE自动配置脚本

1)创建:打开WINDOWS自带的记事本,编辑好代码后另存为“.PAC”格式

2)编辑:使用WINDOWS自带的记事本即可。

3. 如何编写IE自动配置脚本

最简单的格式就是包含一个叫FindProxyForURLJScript函数,IE通过传入

两个变量来调用这个函数,一个是用户浏览的地址URL全路经,一个是这个URL

中的主机名部分(host)

这个FindProxyForURL函数有三种可能的字符串返回值,一是"DIRECT"就是直

接连接,不通过代理;二是"PROXY proxyaddr:port",其中proxyaddrport

分别是代理的地址和代理的端口;三是"SOCKS socksaddr:port"其中socksaddr

port分别是socks代理的地址和端口,一个自动代理文件可以是多个选择的

组合,其中用分号(;)隔开,如:

function FindProxyForURL(url,host)

{

if (host == "")

return "DIRECT";

return "PROXY myproxy:80;

PROXY myotherproxy:8080;

DIRECT";

}

把以上代码另存为的文件,:c:,然后在IE的菜单里"

"->"INTEL选项"->"连接"->局域网设置->把使用自动配置脚本选上,然后在

地址栏填入file://c:/,注意file后是两斜杠,要使设置生效,需要关

IE再重新打开.

现在我们介绍下这个脚本文件,脚本的语法是js语法,js的内置函数

可以使用,要实现自动配置代理,需要实现FindProxyForURL这个函数,其参数

url代表要访问的连接,host代表要访问连接的主机名,该函数有三个返回参数

( direct:直接连接,proxy IP:PORT,socket IP:PORT), 返回结果大小写不敏感.

PAC脚本另外一个重要的应用是多台代理服务器并存的情况下,通过pac脚本的

控制,可以实现如下目标:

使用户随机选择使用多台代理服务器中的任意一台来达到流量负载均衡的目的;

使管理员通过PAC脚本控制用户使用和不使用某台代理服务器,这样可以空出时

间对代理服务器进行维护;

让服务器工作在主备模式,当主服务器宕机时,会自动切换到其它备用服务器而

不会中断服务;

根据访问目的地的不同,自动选择最佳代理服务器。

下面我们介绍几个常用的PAC函数,并举便说明:

<1 isPlainHostName(host),判断是否为本地主机,例如以

myservername/的方式访问,则是直接连接,否则使用代理

function FindProxyForURL(url, host)

{

if (isPlainHostName(host))

return "DIRECT";

else

return "PROXY proxy:80";

}

<2 dnsDomainIs(host, "")localHostOrDomainIs(host, ""),判断所访

问主机是否属于某个域和某个域名,例如属于.域的主机名,

的直接连接,否则使用代理访问。

function FindProxyForURL(url, host)

{

if ((isPlainHostName(host) ||

dnsDomainIs(host, ".")) &&

!localHostOrDomainIs(host, "") &&

!localHostOrDomainIs(host, ""))

return "DIRECT";

else

return "PROXY proxy:80";

}

<3 isResolvable(host),判断被访问主机名能否被解析.例子演示主机名

能否被dns服务器解析,如果能直接访问,否则就通过代理访问。

function FindProxyForURL(url, host)

{

if (isResolvable(host))

<4 isInNet(host, "", ""),判断IP是否在某个子网内.例子演示访问IP

段的主页不使用代理。

function FindProxyForURL(url, host)

{

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

return "DIRECT";

else

return "PROXY proxy:80";

}

<5 shExpMatch(host, ""),判断被访问主机名是否符合某一正则表达式.本

例演示根据主机域名来改变连接类型,本地主机、*.edu*.com分别用不同的

连接方式。

function FindProxyForURL(url, host)

{

if (isPlainHostName(host))

<6 ing(),取URL字符串的子串.本例演示根据不同的协议来选

择不同的代理,httphttpsftpgopher分别使用不同的代理。

function FindProxyForURL(url, host)

{

if (ing(0, 5) == "http:") {

return "PROXY proxy:80";

}

else if (ing(0, 4) == "ftp:") {

return "PROXY fproxy:80";

}

else if (ing(0, 7) == "gopher:") {

return "PROXY gproxy";

}

else if (ing(0, 6) == "https:") {

return "PROXY secproxy:8080";

}

else {

return "DIRECT";

if (dnsResolve(host) == "166.111.8.237") {

return "PROXY secproxy:8080";

}

else {

return "PROXY proxy:80";

}

}

<8 myIpAddress(),返回自己的IP地址.本例演示判断本地IP是否某

IP,如果是就使用代理,否则直接使用连接。

function FindProxyForURL(url, host)

{

if (myIpAddress() == "10.1.1.1") {

return "PROXY proxy:80";

}

else {

if (dnsDomainLevels(host) > 0) { // if number of dots in host >

0

return "PROXY proxy:80";

}

return "DIRECT";

}

<10 weekdayRange(),判断当前日期日否在某一星期段.本例演示当前

日期的范围来改变使用代理,如果是GMT时间周三到周六,使用代理连接,否

则直接连接。

function FindProxyForURL(url, host)

{

if(weekdayRange("WED", "SAT", "GMT"))

return "PROXY proxy:80";

else

return "DIRECT";

}

<11 最后一个例子是演示随机使用代理,这样可以好好利用代理服务器。

function FindProxyForURL(url,host)

{

switch( ( () * 5 ) )

{

case 0:

return "PROXY proxy1:80";

break;

case 1:

return "PROXY proxy2:80";

break;

case 2:

return "PROXY proxy3:80";

break;

case 3:

if (myIpAddress() == "192.168.1.101") return "DIRECT";

else if ( isInNet(host, "XX.0.0.0", "255.0.0.0" ) ) return "DIRECT";

else if ( dnsDomainIs(host,"company") || dnsDomainIs(host,"") )

return "DIRECT";

else if ( dnsDomainIs(host,".CLIENT") || dnsDomainIs(host,".XXXX") )

return "DIRECT";

else return "PROXY :8080";

}

注:红色粗体字均为个人设置,按需求修改。

将这些内容存为c:然后在IE属性->连接->局域网设置->勾选使用

自动配置脚本->填入file://c:/->确定,即可实现自动判断场所上

网了,当然,这个文件也可以存在网站上,当然,这时地址就应该为类似

/......../的格式了。如果你是一个域管理员,你也

可以通过更改组策略的方式把这个地址设置成IE的自动配置脚本.

-----------------------------------------------------END-------------

----------------------------------------------