IE11とProxy自動構成スクリプトの罠

各種ブラウザには Proxy へのリクエスト分岐を細かく制御するための自動構成スクリプト機能がある。

Aサイトに接続するときは Proxy-A を、Bサイトに接続するときは Proxy-B を、内部セグメントに接続するときは Direct 接続を、その他サイトへ接続するときは Proxy-C を、といったような行き先別に Proxy を変更するような設定が簡単に書ける。

PACファイルと呼ばれたりもする。

PACファイルを作るときの注意点について、こちらのサイトがとても良くまとまっていて、IE11 の罠の回避点も書いてある。

PAC file best practices

僕がハマったのは shExpMatch(url,pattern) の使い方。

普通に文法通りに書くと、Chrome なら動くのに、IE11 だと思った通りに動かない!となるパターンがある。

これは IE11 が「自動スクリプトのキャッシュを使用」するからだ。

しかもこのキャッシュが、host名とproxyサーバをセットでキャッシュするという仕様。

自動スクリプトのキャッシュは host名でインデックス化されている。このため、PACファイル内でホスト名+URLの一部を条件にしてプロキシサーバにトラフィックを分散することはできない。

あるhost上のURLのパス部分に基づいて異なるプロキシサーバへのトラフィック分散をすることができない。

例えばこんなの。

if (shExpMatch(url,"http://www.example.com/path1/*")) return "PROXY proxy1.example.com:8080";
if (shExpMatch(url,"http://www.example.com/path2/*")) return "PROXY proxy2.example.com:8080";

www.example.com/path1 にマッチしたら Proxy1 を経由して、www.example.com/path2 にマッチしたら Proxy2 を経由して欲しいという処理を記述している。Chrome だと要望通りに動く。

IE11 だと、最初に host www.example.com は proxy1 を通る。そしてこれについて host名をキーにキャッシュしてしまうので、その後 www.example.com に接続するときは PAC ファイルの中身を評価しない。キャッシュのインデックスが優先される。

困る!何そのクソ仕様キャッシュ!しかも初期値でONだなんて!

URL の PATH に基づいてPROXY の行き先を分岐させたい場合は、このキャッシュをOFFにしよう。毎回リクエストのたびにPACファイルを評価させよう。

グループポリシーの、ユーザー→管理用テンプレ→MicrosoftInternet Explorer→自動プロキシスクリプトのキャッシュの使用を許可しない、を、有効、にしよう。

パスをベースに条件分岐できるとマニュアルに書いておきながらその仕組みを華麗にスルーしてしまう設定が初期値になっているのはつらい。動作速度を優先したからでしょうね。