レガシーブラウザをブロックしているような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」=> 互換モード と判別しても良いかも。