Thursday, November 19, 2009
三十六计(Thirty-Six Stratagems) #英语学习翻译
Monday, November 16, 2009
中国新闻真相(完整版)
Saturday, November 14, 2009
纪检体制改革经历数阶段 党内监督贴近最佳位置
文革期间部分自杀及受虐死亡人员名单
Wednesday, November 4, 2009
英语:新年祝福语
Tuesday, November 3, 2009
如何编写 PAC (Proxy Auto-Config) 文件
出处: http://blog.chinaunix.net/u2/66539/showart_1077372.html
PAC文件,就是Proxy Auto-Config文件的简称,事实上是一个javascript脚本。这个文件定义了如何根据浏览器访问url的不同,自动选取适当的代理(proxy)。
如何编写PAC文件呢,首先必须定义一个主函数FindProxyForURL,格式如下:function FindProxyForURL(url, host)
{
...
}
浏览器在访问每个url的时候都会调用该函数:
ret = FindProxyForURL(url, host);
函数参数中
url 是浏览器访问的完整url地址,例如
http://openattitude.irixs.org/
http://www.google.com/
http://192.168.1.1:8000/
host 是从完整url中截取的子字串,内容是从://开始到下面第一个/或者:中间的部分,以上面url为例分别为
openattitude.irixs.org
www.google.com
192.168.1.1
我们来仔细看一下第三个例子,host字段中不包含端口8000。如果有需要,端口号可以从url字段中提取。
ret 是字符串变量,根据FindProxyForURL()返回值返回单个字符串。如果返回NULL,即返回空字符串,则浏览器不会使用任何代理,这样浏览器将无法打开网页。返回值可以是下列三种结构块的任意组合,每个不同的块之间用分号分割。
DIRECT - 不调用代理,直接连接
PROXY host:port - 调用指定代理(host:port)
SOCKS host:port - 调用指定SOCKS代理(host:port)
如果是选用由分号分割的多块设置,按照从左向右,最左边的代理会被最优先调用,除非浏览器无法成功和proxy建立连接,那么下一个配置就会被调 用。如果浏览器遇到不可用的代理服务器,浏览器将在30分钟后自动重试先前无响应的代理服务器,一个小时后会再次进行尝试,依此类推,每次间隔时间为 30 分钟。这意味着,如果暂时关闭代理服务器,客户机至多在其重新启动后 30 分钟便会重新开始使用该代理服务器。如果所有代理服务器均停用且未指定DIRECT 返回值,浏览器将询问用户是否暂时忽略代理服务器而尝试直接进行连接。Navigator 将询问是否应在 20 分钟后重试代理服务器,接着过 20 分钟会再次询问,依此类推,每次间隔时间为 20 分钟。举例
PROXY proxy.example.com:8080; PROXY proxy.example.com:8081; DIRECT
下面是可用于FindProxyForURL()函数体中的条件函数:
基于主机名的函数:
isPlainHostName()
dnsDomainIs()
localHostOrDomainIs()
isResolvable()
isInNet()
相关的实用程序函数:
dnsResolve()
myIpAddress()
dnsDomainLevels()
基于 URL/主机名 的条件:
shExpMatch()
基于时间的条件:
weekdayRange()
dateRange()
timeRange()
isPlainHostName(host)
host 即上文所述不包含端口号的,url中的主机名,下同,不再赘述。如果主机名中不包含域名则返回true。参考如下:isPlainHostName("www") 返回 true.
isPlainHostName("www.google.com") 返回 false.
dnsDomainIs(host, domain)
domain 用于和hostname进行比较的域名。如果hostname的域名和domain的值相匹配则返回true。参考如下:dnsDomainIs("www.google.com", ".google.com") 返回 true.
dnsDomainIs("www", ".google.com") 返回 false.
dnsDomainIs("www.apple.com", ".google.com") 返回 false.
localHostOrDomainIs(host, hostdom)
hostdom 是要进行匹配的指定的主机名。如果hostname和指定的hostdom相匹配,或者在hostname中没有指定要进行匹配的域名部分,函数返回true。参考如下:
localHostOrDomainIs("www. google.com", "www. google.com") 返回 true (exact match).
localHostOrDomainIs("www", "www. google.com") 返回 true (hostname match, domain not specified).
localHostOrDomainIs("www.apple.com", "www. google.com") 返回 false (domain name mismatch).
localHostOrDomainIs("adc.apple.com", "www. google.com") 返回 false (hostname mismatch).
isResolvable(host)
如果成功解析主机名则返回true。参考如下:isResolvable("www.google.com") 返回 true (除非由于防火墙或某些其他原因导致DNS无法解析).
isResolvable("bogus.domain.foobar") 返回 false.
isInNet(host, pattern, mask)
host 在这里可以是DNS主机名,比如www.google.com,也可以是IP地址。如果传递的是主机名,此函数会将其解析成 IP 地址。 pattern 是点分隔格式的 IP 地址模式。
mask 是IP地址模式掩码,用于确定应对IP地址的哪些部分进行匹配。值为0表示忽略;255表示匹配。如果主机的IP地址与指定的IP地址模式匹配,则返回true。参考如下:isInNet(host, "198.95.249.79", "255.255.255.255") 如果host的IP地址为198.95.249.79则返回 true.
isInNet(host, "198.95.0.0", "255.255.0.0") 如果host的IP地址为198.95.*.*则返回 true.
dnsResolve(host)
host 是要解析的主机名。将给定DNS主机名解析成IP地址,并以点分隔格式的字符串形式将其返回。参考如下:dnsResolve("www.google.com") 返回IP地址 "64.233.189.104".
myIpAddress()
此函数将以点分隔格式的字符串形式返回运行浏览器的那台计算机的IP地址。
dnsDomainLevels(host)
返回url主机名中的DNS层数(圆点数)。参考如下:
dnsDomainLevels("www") 返回 0
dnsDomainLevels("www.google.com") 返回 2
shExpMatch(str, shexp)
str 是要比较的任何字符串(例如,url或主机名)。
shexp 是用以进行比较的shell表达式。如果字符串与指定的 shell 表达式匹配,则此表达式为 true。参考如下:shExpMatch("http://www.apple.com/downloads/macosx/index.html", "*/macosx/*") 返回 true.
shExpMatch("http://www.apple.com/downloads/support/index.html", "*/macosx/*") 返回 false.
weekdayRange(wd1, wd2, gmt)
wd1 和 wd2 为以下任意一个星期日期字符串: SUN MON TUE WED THU FRI SAT, gmt 或者是字串 GMT 或者省略,前者表示格林威治标准时间,后者表示当地时间。 只有第一个参数wd1是强制性的。wd2、gmt 中的任一个或两者皆可省略。如果只有一个参数,则此函数将在该参数所表示的星期日期返回true。如果指定字符串GMT作为第二个参数,则采用GMT时 间,否则采用当地时区的时间。如果wd1和wd2均被定义,则该条件在当前星期日期介于这两个星期日期之间时为true。首末日期包括在内。参数顺序很重 要;"MON," "WED" 指星期一到星期三,而 "WED," "MON" 是从星期三到下周的星期一。
weekdayRange("MON", "FRI") 从星期一到星期五(当地时区)为 true.
weekdayRange("MON", "FRI", "GMT") 从格林威治标准时间星期一到星期五为 true.
weekdayRange("SAT") 当地时间星期六为 true.
weekdayRange("SAT", "GMT") 格林威治标准时间星期六为 true.
weekdayRange("FRI", "MON") 从星期五到下星期一为 true (注意,顺序很重要).
dateRange(day)
dateRange(day1, day2)
dateRange(mon)
dateRange(month1, month2)
dateRange(year)
dateRange(year1, year2)
dateRange(day1, month1, day2, month2)
dateRange(month1, year1, month2, year2)
dateRange(day1, month1, year1, day2, month2, year2)
dateRange(day1, month1, year1, day2, month2, year2, gmt)
day 每月1到31号中的任意一天(整数类型).
month 是如下表示月份的字符串中的一个:JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC, year 是表示年份的完整数字,例如1995(而不是95)。整数类型。
gmt 或者为字符串GMT,或者保留为空,前者将以格林威治标准时间进行时间比较,后者假定时间处于当地时区。尽管上 面表示的函数语法不是每一个都包含gmt参数,事实上可以在上述9个任一调用配置文件中指定gmt参数,不过,它始终都要作为最后一个参数。如果只指定了 单个值(对于每个类别:day、month、year),则此函数仅在与指定值匹配的日子才会返回true。如果指定了两个值,则从指定的第一个时间到指 定的第二个时间,结果均为truee。首末日期包括在内。参考如下:
dateRange(1) 在当地时区每月的第一天为 true.
dateRange(1, "GMT") 在GMT时间每月的第一天为 true.
dateRange(1, 15) 在当地时区每月的1号到15号为 true.
dateRange(24, "DEC") 在当地时区每年12月24号为 true.
dateRange(24, "DEC", 1995) 在当地时区1995年12月24号为 true.
dateRange("JAN", "MAR") 在当地时区每年第一季度(1月到3月)为 true.
dateRange(1, "JUN", 15, "AUG") 在当地时区每年6月1号到8月15号为 true, 首末日期包括在内.
dateRange(1, "JUN", 15, 1995, "AUG", 1995) 在当地时区1995年6月1号到8月15号为 true, 首末日期包括在内.
dateRange("OCT", 1995, "MAR", 1996) 在当地时区1995年10月到1996年3月为 true.
dateRange(1995) 在当地时区1995年为 true.
dateRange(1995, 1997) 在当地时区1995年1月1号到1997年12月31号(1995年初到1997年底)为 true.
timeRange(hour)
timeRange(hour1, hour2)
timeRange(hour1, min1, hour2, min2)
timeRange(hour1, min1, sec1, hour2, min2, sec2)
timeRange(hour1, min1, sec1, hour2, min2, sec2, gmt)
hour 是0点(午夜12点)到23点(晚上11点)表示小时的数值中的一个。
min 是表示分钟的0到59中的一个值。
sec 是表示秒钟的0到59中的一个值。
gmt 同上文所述。
timerange(12)中午12点到下午1点之间为 true.
timerange(12, 13)同上例.
timerange(12, "GMT")在GMT时间中午12点到下午1点之间为 true.
timerange(9, 17)上午9点到下午5点之间为 true.
timerange(8, 30, 17, 00)上午8点30分到下午5点之间为 true.
timerange(0, 0, 0, 0, 0, 30)午夜0点到其后的30秒内为 true.
-完-
浏览器自动选择 Proxy 配置案例
出处: http://www.chinagfw.org/2009/07/proxy.html
在某些地方上网时,比如南京大学的校园网中,某些公司的局域网中,我们可能需要用到代理服务器。代理服务器的切换一直是一个让人头痛的话题,IE 浏览器有一个 ProxySwither Lite 软件可以用来切换代理,Firefox 有一批插件可以用来切换代理,但是,很难用它们来解决全局性的问题,使用前的配置也是比较麻烦的事情。那么,有没有一种方法可以一劳永逸地解决这个问题呢?答案是有的,那就是 PAC(Proxy Auto-Config) 文件。
使用 PAC 文件我们可以做到:1. IE、Firefox、Opera...浏览器使用同一个代理配置方案,Windows、Linux多系统使用同一个代理配置方案;2. 针对特定的域名,使用特定的代理;3. 针对特定的 IP 范围,使用特定的代理;4. 针对特定的 URL 模式,使用特定的代理。
下面我们来看一个案例:
假设小明的电脑位于 C 公司的局域网中,C 公司为了某些需要禁止员工访问某些站点,例如: alogspot.com 和 bwitter.com ,但是小明的工作和学习需要经常访问这些站点,公司的网管给小明带来了很大不便。不过小明很聪明,他找到了一个可以访问被禁那些站点的一个代理 127.0.0.1:8000。虽然通过该代理小明可以访问这些站点,但是切换代理和浏览器设置始终是麻烦;特别是在用doogle.com 搜索到的某些文章位于 alogspot.com 时,一不小心点了搜索结果,到搜索引擎 doogle.com 的连接就会有很大一会儿被重置。因为小明的代理速度比较慢,总不能用代理上所有网站吧?这真是件麻烦事,小明该怎么办呢?
虽然很头痛,但是互联网的开拓者们给我们留下了那么多遗产,怎么能不好好利用呢?小明翻出了一个尘封已久的 Wiki 页面,缓缓回忆起那古老的 Javascript 语言,顿时有了主意,于是他写出了下面这个 PAC 脚本:
// 看看域名是不是本地站点
function isLocalHost(host)
{
if( dnsDomainIs(host, "localhost") )
return true;
return false;
}
// 看看域名是不是禁止访问的站点
function isBlockedHost(host)
{
if( dnsDomainIs(host, "alogspot.com") ||
dnsDomainIs(host, "bwitter.com") )
return true;
return false;
}
// 看看搜索结果 URL 中是不是包含被禁止访问的关键字
function isBlockedURL(url, host)
{
if( dnsDomainIs(host, "doogle.com") ) {
if ( shExpMatch(url, "*alogspot.com*") ||
shExpMatch(url, "*bwitter.com*") )
return true;
}
return false;
}
// 看看 IP 在不在本地 IP 范围内
function isLocalIP(addr)
{
if( isInNet(addr,"127.0.0.0","255.0.0.0") ||
isInNet(addr,"10.0.0.0","255.0.0.0") ||
isInNet(addr,"192.168.0.0","255.255.0.0") ||
isInNet(addr,"172.16.0.0","255.255.0.0") )
return true;
return false;
}
// 看看 IP 在不在被禁止访问的 IP 范围内
function isBlockedIP(addr)
{
return false;
}
// 看看 IP 地址是不是 IPv6 地址
function isIPV6(addr)
{
if( shExpMatch(addr, "*:*") )
return true;
return false;
}
// 这是浏览器默认调用的函数接口
function FindProxyForURL(url, host)
{
var direct = "DIRECT";
var httpProxy = "PROXY localhost:8000";
var socksProxy = "SOCKS localhost:9050"; // 留着做个参考
if(isLocalHost(host)) {
// 如果是本地域名,那就直连
return direct;
} else if(isBlockedURL(url, host) || isBlockedHost(host)) {
// 如果是被禁止访问的域名,或者搜索结果 URL 中含有被禁止访问的关键词,那就走代理
return httpProxy;
}if(!isResolvable(host)) {
// 如果域名不能解析,那就直连
return direct;
}
// 解析域名到 IP 地址
var IpAddr = dnsResolve(host);if(isLocalIP(IpAddr) || isIPV6(IpAddr)) {
// 如果是本地 IP 或者 IPv6 地址,那就直连
return direct;
} else if(isBlockedIP(IpAddr)) {
// 如果是被禁止访问的地址,那就走代理
return httpProxy;
} else {
// 剩下的,唉,就直连吧
return direct;
}
}
小明将以上内容保存为 C:proxy.pac(~/proxy.pac),然后到
Firefox 中,选择 工具->选项->高级->网络->设置(Edit->Preferences->Advanced->Network->Settings),将 file:///c:/proxy.pac(file:///home/username/proxy.pac)填入"自动代理配置 URL"(Automatic proxy configuration URL)文本框中;
再到
IE 中,选择 工具->Internet 选项->连接->局域网设置,勾选使用自动配置脚本,填入 file://c:/proxy.pac;
再到
Opera 中,选择 Tools->Preferences->Advanced->Network->Proxy Servers,勾选上 Use automatic proxy configuration,填入 file://c:/proxy.pac。
从此,小明就开始了自己幸福的互联网冲浪生活,再也没有看到那曾经熟悉的"到该网站的连接已被重置"消息了。