UserAgentからIEの互換モードを判別する


レガシーブラウザをブロックしているようなWebページにて
IE7はブロックしたいけどIEの互換モードであれば利用させたい時にどうしたらいいか調べてみました。
結果的にUserAgentで判別出来る事が分かったのでまとめておきます。

まずはMSIEを確認

IEの場合にはUAに含まれるMSIEという識別子からバージョンが判別できます。
これは広く知られている手法ですね。

続いてTridentを確認

IE8以降はMSIEだけでなくTridentという識別子が含まれるようになっており、こちらでもバージョンが判別できます。

ちょっと実際のUAを見てみましょう。

IE9だとこんな感じです

Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)

Trident => 5はIE9に該当します。

MSIEとTridentの関係は以下のようになります。

IE MSIE Trident
8 8 4
9 9 5
10 10 6
11 11 7

互換モード使用時のUA

互換モードを使用するとこの関係に変化が現れます。

ではIE11で互換モードを使用した場合のUAを見てみましょう。

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0; InfoPath.3; GWX:DOWNLOADED; GWX:RESERVED; GWX:QUALIFIED)

Tridentは互換モード使用前後で変わりませんが、MSIEは互換後のバージョンになっているのが分かります。

互換モードを使用した時のMSIEとTridentの関係は以下のようになります。

IE MSIE Trident
8 (互換モード) 7 4
9 (互換モード) 7 5
10 (互換モード) 7 6
11 (互換モード) 7 7

互換モードの判定方法

「Trident == 7」かつ「MSIE != 11」=> 互換モード
「Trident == 6」かつ「MSIE != 10」=> 互換モード
「Trident == 5」かつ「MSIE != 9」=> 互換モード という具合。

ちなみに僕が検証した端末では互換モードを使用するとどれもIE7として振る舞うようだったので
「Tridentが含まれる」かつ「MSIE == 7」=> 互換モード と判別しても良いかも。