WEBrick で広告ブロッカーを作成して、使ってたまではよかったんだけど、
- 大きいファイルをダウンロードすると、ルータにしているノートPCが落ちる
- YouTube とかの動画の再生が始まるまでが長い
ということに気がついた。
これは
- どのサイトのページでも、どんな content-type のファイルでも、必ず一度 proxy のプロセスを通る(ように設定している)
- WEBrick がファイルの内容を全部受けとってからブラウザ側に流している(らしい)
のが原因みたい。
ということで、「アクセス先やファイルの種類によっては proxy を通さずアクセスする」という方法を、 proxy.pac (自動プロキシ設定ファイル)を作成して実現。
ファイルは基本的には JavaScript ファイルで、内容はこんな感じ(コメントは追加)。
自作 proxy は、 192.168.0.1 で 8080 を listen してます。
function FindProxyForURL(url, host) { if ( shExpMatch(url, "http://*") ) { // HTTP にのみ注目、それ以外のプロトコルは素通りにする if ( isInNet(host, "10.0.0.1" , "255.0.0.0" ) || isInNet(host, "127.0.0.0" , "255.0.0.0" ) || isInNet(host, "192.168.0.0" , "255.255.0.0" ) ) { // private network へのアクセスはスルー return "DIRECT"; } else if ( shExpMatch(host, "*youtube*") || shExpMatch(host, "*stage6*") ) { // YouTube, stage6 はアクセス速度低下に繋がるため // スルー return "DIRECT"; } else if ( shExpMatch(url, "*.zip*") || shExpMatch(url, "*.exe*") || shExpMatch(url, "*.cab*") || shExpMatch(url, "*.gz*") || shExpMatch(url, "*.lzh*") || shExpMatch(url, "*.bz2*") || shExpMatch(url, "*.flv*") || shExpMatch(url, "*.swf*") || shExpMatch(url, "*.divx*") || shExpMatch(url, "*.js*") || shExpMatch(url, "*.jpg") || shExpMatch(url, "*.png") || shExpMatch(url, "*.css") || shExpMatch(url, "*.gif") ) { // 上記のファイルは見ても仕方がないのでスルー // (.html だけを対象に見ればいいかというと、 cgi やら // php やら何やかんやがあるのでホワイトリスト方式に) return "DIRECT"; } else { // 上で除外したもの以外は proxy を通す return "PROXY 192.168.0.1:8080"; } } else { return "DIRECT"; } }
このへんのページを参考にしました。
http://ash.jp/freebsd/proxy_auto.htm
http://homepage1.nifty.com/yito/anhttpd/faq/autoproxy.html
http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html