サーバーサイドから強制的にIEの互換性モードをオフに設定する方法とは?
質問
ドメイン管理された環境で、X-UA タグ、!DOCTYPE 定義、および "IE=Edge" 応答ヘッダーを提供していても、特定のクライアント (winXP/Win7, IE8/IE9) で互換モードがトリガーされることが分かっています。これらのクライアントは、「イントラネットのサイトを互換表示する」チェックボックスをオンにしています。これは、まさに私がオーバーライドしようとしているものです。
以下は、IE が実際に互換性モードをトリガーすることを決定する方法を理解するために使用したドキュメントです。
http://msdn.microsoft.com/en-us/library/ff406036%28v=VS.85%29.aspx
http://blogs.msdn.com/b/ie/archive/2009/02/16/just-the-facts-recap-of-compatibility-view.aspx
<ブロッククオートサイトオーナーは 常に であり、コンテンツを管理しています。 サイト所有者は、X-UA-Compatible タグを使用して、サイトの表示方法を明確に宣言し、標準モードのページを IE7 の標準にマップすることを選択できます。 X-UA-Compatible タグを使用すると、クライアント側で互換表示を上書きします。
グーグルでは "Defining Document Compatibility" が、残念ながらSPAMエンジンは2つ以上のURLを投稿することを許さない。
これは
ASP .NET
のウェブアプリで、マスターページに以下の定義が含まれています。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
</head>
と
web.config
<system.webServer>
<httpProtocol>
<customHeaders>
<clear />
<add name="X-UA-Compatible" value="IE=Edge" />
</customHeaders>
</httpProtocol>
</system.webServer>
Fiddlerを使って、ヘッダーが確かに正しく注入されていることを確認しています。
私の理解では、これらの設定により、"Display intranet sites in Compatibility View" browser setting を上書きすることができるはずです。しかし、クライアントによっては、互換モードをまだトリガーしていることがわかりました。 また、異なるクライアントで同じ認証情報を使用しても異なる結果が得られるため、ポリシー グループの設定ではなく、マシン レベルに起因しているようです。
互換表示設定] チェックボックスを無効にすると、トリックが実行されます。しかし、実際の目的は、クライアントの設定に関係なく、アプリがまったく同じ方法でレンダリングされることを確認することです。
何か考えがあれば、また、私が見逃している可能性のあるものは何ですか? 互換モードをトリガーすることなく、常に IE でページをレンダリングするように強制することは可能でしょうか?
100 万に感謝します。
ジャウマ
PS: は現在開発中のサイトで、もちろんマイクロソフトの互換性リストにはありませんが、念のため確認もしておきました。
でググってみてください。 "Understanding the Compatibility View List"
2つ以上のURLを投稿することはできません。
どのように解決するのですか?
一般的な2つの方法に問題があることがわかりました。
-
カスタムヘッダでこれを行う (
<customHeaders>
) を使ってこれを行うと、同じアプリケーションの異なるデプロイメントが異なる設定を持つことができます。私は、これは失敗する可能性があることの1つだと思うので、アプリケーションがコードでこれを指定する方が良いと思います。また IIS6 はこれをサポートしていません . -
HTMLを含む
<meta>
タグを含めることは、上記の方法よりも良いように思われます。しかし、いくつかのページがこれらを継承していない場合、タグを複製する必要があるため、保守性と信頼性の問題が発生する可能性があります。 -
のみを送信することで、ネットワークトラフィックを削減することができます。
X-UA-Compatible
ヘッダーのみを Internet Explorer クライアントに送信することで、ネットワーク トラフィックを削減できます。
よく構造化されたアプリケーション
アプリケーションが、すべてのページが最終的に単一のルートページから継承されるような構造になっている場合、そのルートページには
<meta>
タグを含めます。
その他の回答
.
レガシーアプリケーション
その他
すべての HTML 応答に HTTP ヘッダを自動的に追加するのが最も良い方法だと思います。
これを行う一つの方法として
を使用することです。
IHttpModule
:
public class IeCompatibilityModeDisabler : IHttpModule
{
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += (sender, e) => DisableCompatibilityModeIfApplicable();
}
private void DisableCompatibilityModeIfApplicable()
{
if (IsIe && IsPage)
DisableCompatibilityMode();
}
private void DisableCompatibilityMode()
{
var response = Context.Response;
response.AddHeader("X-UA-Compatible", "IE=edge");
}
private bool IsIe { get { return Context.Request.Browser.IsBrowser("IE"); } }
private bool IsPage { get { return Context.Handler is Page; } }
private HttpContext Context { get { return HttpContext.Current; } }
public void Dispose() { }
}
IE=edge
は、IE が(互換モードではなく)最新のレンダリングエンジンを使ってページを表示することを示します。
HTTP モジュールは web.config ファイルに登録されることが多いようですが、これでは最初の問題に逆戻りしてしまいます。しかし であれば、Global.asaxでプログラム的に登録することができます。 のようにします。
public class Global : HttpApplication
{
private static IeCompatibilityModeDisabler module;
void Application_Start(object sender, EventArgs e)
{
module = new IeCompatibilityModeDisabler();
}
public override void Init()
{
base.Init();
module.Init(this);
}
}
なお、このモジュールは
static
でインスタンス化されていないことです。
Init
でインスタンス化されないようにすることで、アプリケーションごとに1つのインスタンスしか存在しないようにします。もちろん、実際のアプリケーションでは、IoC コンテナがこれを管理する必要があるでしょう。
利点
- この回答の冒頭で説明した問題を克服しています。
デメリット
- ウェブサイトの管理者は、ヘッダーの値を制御できません。これは、Internet Explorer の新しいバージョンが出て、ウェブサイトのレンダリングに悪影響を及ぼす場合に問題となりえます。しかし、これは、ハードコードされた値を使用する代わりに、モジュールにアプリケーションの設定ファイルからヘッダー値を読み取らせることで克服することができます。
- これは ASP.NET MVC で動作するように修正が必要な場合があります。
- 静的な HTML ページでは動作しません。
-
は
PreSendRequestHeaders
イベントは、IIS6 では発生しないようです。私はまだこのバグを解決する方法を見つけられていません。
関連
-
net core downlink tracking skywalking インストールと使いやすいチュートリアル
-
Net CoreによるAutoFacの利用
-
Application_End イベントをブロックする解決策
-
[解決済み] IIS 500.19 with 0x80070005 The requested page cannot be accessed because the related configuration data for the page is invalid error.
-
[解決済み] タグを使用してIE互換モードを強制的にオフにする
-
[解決済み】X-UA-CompatibleをIE=edgeに設定しても、互換モードが止まらない。
-
[解決済み] web.configの変換で "Replace Or Insert "を行う方法はありますか?
-
[解決済み] イベントログへの書き込み時にSystem.Security.SecurityExceptionが発生する。
-
[解決済み] フレームワークのランタイムターゲットが見つからない .NETCoreApp=v1 互換ランタイムの1つと互換性がある
-
[解決済み] X-UA-Compatible IE=Edgeを使う理由は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
swagger uiをasp.net coreに統合する原理
-
ASP.NET Core MVC Dependency Injection ビューとコントローラ
-
認証プロセスの記録にjwtを使用したネット
-
再起動を伴わないNET5の設定変更は自動的に反映される
-
[解決済み] <meta http-equiv="X-UA-Compatible" content="IE=edge">は何をするのですか?
-
[解決済み] System.Data.Entity.Internal.AppConfig' の型イニシャライザーで例外が発生しました。
-
[解決済み] クライアントから危険な可能性のあるRequest.Formの値が検出された
-
[解決済み】ASP.NET IdentityのIUserSecurityStampStore<TUser>インターフェースとは何ですか?
-
[解決済み] Server.UrlEncode vs. HttpUtility.UrlEncode
-
ASP.NET MVC 4 受信するすべてのリクエストを傍受する