更新:2010-03-23 22:42:59
更新说明:测试不够充分,刚才又发现了几个之前没注意的问题,补充更新之。
更新1:Firefox 3.6的myIpAddress()函数对于有IPv6协议栈的主机的支持还是有问题,经过在Windows XP SP3+Firefox 3.6上测试,发现返回的是::1!
临时解决方法:about:config中,手工编辑设置项:network.dns.disableIPv6为true
chrome的最新代码分支已经解决了这个bug!
更新2:在Firefox中调试pac文件的技巧!
直接alert(msg),然后在“错误控制台”里可以看到msg!
更新3:IE支持一系列新的pac扩展函数,主要针对的就是IPv6的支持!见参考资源4.
更新4:Ubuntu 9.04+Firefox 3.6组合下,myIpAddress()函数返回的地址居然是127.0.1.1! 好在Chrome 5解析依然可以返回正确的本机IP地址。
更新5:在Ubuntu下修复Firefox的解析bug可以采用修改hosts文件的方法,具体来说,添加本机的默认路由IP地址所对应主机名(bash下可以使用hostname命令查看当前主机名)的记录。
如:
118.zzz.xxx.167 your-computer-name
自从买了主机以来,一直使用pac文件来实现智能的代理上网,支持的智能代理功能包括:
- 根据本机IP地址是教育网还是公网选择正确的默认代理地址,达到在教育网访问免费IP地址站点时直连,在公网访问教育网地址时使用学校的代理或VPN
- 根据目的网址是否被河蟹选择正确的代理地址
刚开始的时候一直有一个bug没有解决,那就是在学校使用的时候无法正确的识别本机IP地址,使用ADSL时就没有问题。通过一段时间的摸索之后,发现了问题所在!
IPv6!
由于教育网已经普及了IPv6地址,因此Firefox在解释执行myIpAddress()函数时返回的IP地址是IPv6的地址!而我之前在pac脚本里一直使用的是这段代码来判断本机IP地址的:
isInNet(myIpAddress(),"59.64.0.0","255.255.0.0")
上述代码在纯IPv4环境中是没有问题的,但关键问题是在有IPv6地址的主机上,myIpAddress()返回的地址格式是IPv6格式的!因此,isInNet函数就会解析失败了。
通过Google和自己的动手实践,现在改用以下代码来检测本机IP地址
if (shExpMatch(myIpAddress(), "*:59.64.*") || isInNet(myIpAddress(),"59.64.0.0","255.255.0.0") )
通过一段时间的测试来看,在以下平台和浏览器上测试通过上述代码:
- Windows XP: Firefox 3.6/IE 8/Chrome 5
- Ubuntu: Firefox 3.6/Chrome 5
附几段有用的pac代码片段
var resolved_ip = dnsResolve(host);
if (isInNet(resolved_ip, "10.0.0.0", "255.0.0.0") ||
isInNet(resolved_ip, "172.16.0.0", "255.240.0.0") ||
isInNet(resolved_ip, "192.168.0.0", "255.255.0.0") ||
isInNet(resolved_ip, "127.0.0.0", "255.255.255.0"))
{
return "DIRECT";
}
DEFAULT = "PROXY proxy.bupt.edu.cn:8080";
if(/\.cnki\.net/i.test(url)) return "DIRECT";
if(/\.ieee\.org/i.test(url)) return "DIRECT";
if(/\.sciencedirect\.com/i.test(url)) return "DIRECT";
if(/\.edu\.cn/i.test(url)) return "DIRECT";
if(/\.springerlink\.com/i.test(url)) return "DIRECT";
参考资源
- proxy.pac myIpAddress() returns incorrect format?
- Autoconfigure Scripts for Proxy Settings – Apr. 22, 2004
- http://autoproxy-gfwlist.googlecode.com/svn/trunk/gfwlist.txt
- http://blogs.msdn.com/wndp/archive/2006/07/18/IPV6-WPAD-for-WinHttp-and-WinInet.aspx