privoxy是一款强大的代理调度器,看到muzuiget同学的介绍我就心动了,由于比较忙所以前两天才开始尝试,很快就发现了一个问题:直接在火狐地址栏里输入关键字会转到privoxy的“找不到域名”的错误页。
依我的推测,火狐总是尝试解析用户在地址栏输入的字符串,当解析失败时就尝试添加.com这样的后缀,然后尝试向Google查询,或者返回一个最接近的结果,或者返回Google搜索页面。(所以,我非常讨厌垃圾电信的114广告,使得任何原本不能解析的域名都解析到它的广告页了。)
在使用HTTP代理之后,火狐无法得知域名解析是否成功,因为代理在出错时返回了出错页面。这让我这个重试依赖她的地址栏的火狐迷郁闷了一天,最终(部分地)解决了此问题。
privoxy果然强大,出错页都是可以自定义的,默认这些模板在配置目录的templates
目录下,很容易猜到处理域名解析失败的文件是no-such-domain
。于是我在改了下其外观的同时,先是加上搜索功能:
<p> This is often a temporary failure, so you might just <a href="@protocol@@hostport@@path@">try again</a>, or <a href="https://encrypted.google.com/search?hl=zh-CN&q=@hostport@">Google @host@</a>. </p>
这样还不行,不光得点一下,而且只能跳转到Google的搜索页。想到Google有个“手气不错”按钮,于是利用之:
var abar = function(){ if(document.referrer) return; var host = "@host@"; if(host.indexOf('.')<0 || host.indexOf(' ')>-1){ document.title = "跳转中..."; window.location = "https://encrypted.google.com/search?hl=zh-CN&q="+host+"&btnI=1"; } }; abar();
将这段代码加到<head>
后即可实现输入关键字后自动使用Google的“手气不错”服务跳转到接近的页面,或者是Google搜索页面。
但测试几次后发现,这样还有问题:如果输入中文,将搜索其punycode而不是中文了。比如在地址栏输入“测试”,回车之后会搜索“xn--0zwm56d”,进而跳转到http://www.iana.org/domains/root/db/xn--0zwm56d.html。看来需要用Javascript解punycode了。Google下,在stackoverflow看到了一个实现,还是放弃版权的~只是我没发现怎么才能让privoxy的错误页调用本地的外部Javascript文件,所以直接把代码嵌进去了,这让我这个喜欢代码整洁的人有点不爽。。。
var abar = function(){ if(document.referrer) return; var host = punycode.ToUnicode("@host@"); if(host.indexOf('.')<0 || host.indexOf(' ')>-1){ document.title = "跳转中..."; window.location = "https://encrypted.google.com/search?hl=zh-CN&q="+host+"&btnI=1"; } }; abar();
按说这样的设计是跨浏览器的,于是我测试了下Google Chrome,发现其并不买帐,输入看起来不像域名的字符串后,Chrome直接进到搜索页面。。。。还是火狐好啊~~