世界之窗论坛's Archiver

hoyou 发表于 2008-4-22 18:19

教你如何让浏览器根据当前地址自动切换代理

因为本人浏览经常要在教育网和公网之间切换,且偶尔需要翻墙,所以时常需要切换代理服务器。
Maxthon的代理设置是相当的强大,不仅可以增加条件判断,而且还可以记录代理服务器的用户名密码。TW在这方面就逊色多了,不过我们可以通过IE的自动代理脚本来使TW根据当前浏览地址自动切换代理服务器.(如果将来TW能支持代理脚本最好了,换机器不用重新设置)
方法:IE的菜单里"工具"->"INTEL选项"->"连接"->局域网设置,把使用自动配置脚本选上,然后在地址栏填入file://c:/proxy.pac,并把TW代理设置为“使用IE设置”,重启浏览器即可

pac脚本写起来比较简单,可依据以下转帖介绍:
[quote]
proxy.pac脚本文件的语法是js语法,js的内置函数可以使用,要实现自动配置代理,需要实现FindProxyForURL这个函数,其参数url代表要访问的连接,host代表要访问连接的主机名,该函数有三个返回参数
direct:直接连接
proxy IP:PORT
socket IP:PORT
返回结果大小写不敏感

PAC的其他内置语法见[url=http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html]http://wp.netscape.com/eng/mozil ... emo/proxy-live.html[/url]
下面列举几个PAC的实例,顺便学习下它的语法

a、isPlainHostName(host),本例演示判断是否为本地主机,如http://myservername/
的方式访问,如果是直接连接,否则使用代理
function FindProxyForURL(url, host)
{
if (isPlainHostName(host))
return "DIRECT";
else
return "PROXY proxy:80";
}

b、dnsDomainIs(host, "")、localHostOrDomainIs(host, ""),本例演示判断访问主机
是否属于某个域和某个域名,如果属于.company.com域的主机名,而域名不是
www.company.com和home.company.com的直接连接,否则使用代理访问。
function FindProxyForURL(url, host)
{
if ((isPlainHostName(host) ||
dnsDomainIs(host, ".company.com")) &&
!localHostOrDomainIs(host, "www.company.com") &&
!localHostOrDomainIs(host, "home.company.com"))

return "DIRECT";
else
return "PROXY proxy:80";
}

c、isResolvable(host),本例演示主机名能否被dns服务器解析,如果能直接访问,否
则就通过代理访问。
function FindProxyForURL(url, host)
{
if (isResolvable(host))
return "DIRECT";
else
return "PROXY proxy:80";
}

d、isInNet(host, "", ""),本例演示访问IP是否在某个子网内,如果是就直接访问,
否则就通过代理,例子演示访问清华IP段的主页不用代理。
function FindProxyForURL(url, host)
{
if (isInNet(host, "166.111.0.0", "255.255.0.0"))
return "DIRECT";
else
return "PROXY proxy:80";
}

e、shExpMatch(host, ""),本例演示根据主机域名来改变连接类型,本地主机、*.edu、
*.com分别用不同的连接方式。
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:80";
}

f、url.substring(),本例演示根据不同的协议来选择不同的代理,http、https、ftp、
gopher分别使用不同的代理。
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";
}
}

g、dnsResolve(host),本例演示判断访问主机是否某个IP,如果是就使用代理,否则直
接连接。
function FindProxyForURL(url, host)
{
if (dnsResolve(host) == "166.111.8.237") {
return "PROXY secproxy:8080";
}
else {
return "PROXY proxy:80";
}
}

h、myIpAddress(),本例演示判断本地IP是否某个IP,如果是就使用代理,否则直接使
用连接。
function FindProxyForURL(url, host)
{
if (myIpAddress() == "166.111.8.238") {
return "PROXY proxy:80";
}
else {
return "DIRECT";
}
}

i、dnsDomainLevels(host),本例演示访问主机的域名级数是几级,就是域名有几个点
如果域名中有点,就通过代理访问,否则直接连接。
function FindProxyForURL(url, host)
{
if (dnsDomainLevels(host) > 0) { // if number of dots in host > 0
return "PROXY proxy:80";
}
return "DIRECT";
}

j、weekdayRange(),本例演示当前日期的范围来改变使用代理,如果是GMT时间周三
到周六,使用代理连接,否则直接连接。
function FindProxyForURL(url, host)
{
if(weekdayRange("WED", "SAT", "GMT"))
return "PROXY proxy:80";
else
return "DIRECT";
}

k、最后一个例子是演示随机使用代理,这样可以好好利用代理服务器。
function FindProxyForURL(url,host)
{
return randomProxy();
}

function randomProxy()
{
switch( Math.floor( Math.random() * 5 ) )
{
case 0:
return "PROXY proxy1:80";
break;
case 1:
return "PROXY proxy2:80";
break;
case 2:
return "PROXY proxy3:80";
break;
case 3:
return "PROXY proxy4:80";
break;
case 4:
return "PROXY proxy5:80";
break;
}
}
[/quote]

[[i] 本帖最后由 hoyou 于 2008-4-22 18:25 编辑 [/i]]

八万 发表于 2008-4-22 18:37

原帖昨天看过!楼主发帖请尊重版权:P
不会用,不好学;貌似把这些功能整合到设置里,TW一定更加**:lol:

sky5 发表于 2008-4-22 18:40

谁贡献一个PAC啊

hoyou 发表于 2008-4-22 18:41

帖子里注明是转帖的啊

用起来不难把,那么多函数,其实基本上会用dnsDomainIs和isInNet就可以了,前者用来判断域名,后者用来判断IP段

hoyou 发表于 2008-4-22 18:45

[quote]原帖由 [i]sky5[/i] 于 2008-4-22 18:40 发表 [url=http://bbs.ioage.com/cn/redirect.php?goto=findpost&pid=533494&ptid=56368][img]http://bbs.ioage.com/cn/images/common/back.gif[/img][/url]
谁贡献一个PAC啊 [/quote]

可以参照我写的

// IE自动代理设置  file://D:\Software\Browser\TheWorld\proxy.pac
function FindProxyForURL(url,host){
  if (
    dnsDomainIs(host, ".fudan.edu.cn") ||
    isInNet(host, "202.120.0.0", "255.255.0.0")
    )
      return "PROXY 61.129.42.3:8080";
  else if (
    dnsDomainIs(host, "njnu.edu.cn")
    )
      return "PROXY 202.119.104.1:8080";
    else
      return "DIRECT"; //直接访问
}

AY 发表于 2008-4-22 19:12

可是每次更改 pac 要重启浏览器,不太方便。

linlee 发表于 2008-4-23 09:49

我在期待个跟gladder一样的插件:water:

Xorcerer 发表于 2008-4-23 12:50

[quote]原帖由 [i]hoyou[/i] 于 2008-4-22 18:41 发表 [url=http://bbs.ioage.com/cn/redirect.php?goto=findpost&pid=533495&ptid=56368][img]http://bbs.ioage.com/cn/images/common/back.gif[/img][/url]
帖子里注明是转帖的啊

用起来不难把,那么多函数,其实基本上会用dnsDomainIs和isInNet就可以了,前者用来判断域名,后者用来判断IP段 [/quote]

请问,怎么看不见原帖的出处?

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.