IEの互換モードをサーバー側から強制的にオフに設定するにはどうすればよいですか?


84

ドメイン制御環境では、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タグを使用すると、クライアントの互換表示が上書きされます。

Googleは「ドキュメントの互換性を定義するために使用していますが、残念ながら、SPAMエンジンでは2つ以上のURLを投稿できません。

これはASP .NETWebアプリであり、マスターページに次の定義が含まれています。

<!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を使用して、ヘッダーが実際に正しく挿入されていることを確認しました。

私の理解では、これらの設定を使用すると、「互換表示でイントラネットサイトを表示する」ブラウザ設定を上書きできるはずです。しかし、クライアントによっては、互換モードをトリガーするものもあることがわかりました。また、異なるクライアントで同じ資格情報のセットを使用した場合でも異なる結果が得られるため、ポリシーグループ設定ではなくマシンレベルにまで低下しているようです。

[互換表示設定]チェックボックスを無効にするとうまくいきます。ただし、実際の目的は、クライアントの設定に関係なく、アプリがまったく同じ方法でレンダリングされるようにすることです。

何か考えや私が見逃している可能性があるものは何ですか?互換モードをトリガーせずにIEに常にページをレンダリングさせることは可能ですか?

どうもありがとう、

ジャウメ

PS:このサイトは現在開発中であり、もちろんMicrosoftの互換性リストには含まれていませんが、念のためチェックしました。

Googleの「互換表示リストを理解する」の場合、残念ながら、SPAMエンジンでは2つ以上のURLを投稿できません。

回答:


45

これを行う2つの一般的な方法に問題が見つかりました。

  1. <customHeaders>web.configのカスタムヘッダー()を使用してこれを行うと、同じアプリケーションの異なるデプロイメントでこれを異なる方法で設定できます。これはもう1つ問題が発生する可能性があると考えているため、アプリケーションでコードで指定した方がよいと思います。また、IIS6はこれをサポートしていません

  2. <meta>WebフォームマスターページまたはMVCレイアウトページにHTMLタグを含めることは、上記よりも優れているようです。ただし、一部のページがこれらから継承しない場合は、タグを複製する必要があるため、保守性と信頼性に問題が生じる可能性があります。

  3. X-UA-CompatibleヘッダーをInternetExplorerクライアントに送信するだけで、ネットワークトラフィックを減らすことができます。

よく構成されたアプリケーション

すべてのページが最終的に単一のルートページから継承されるようにアプリケーションが構成されている場合<meta>、他の回答に示されいるようにタグを含めます

レガシーアプリケーション

それ以外の場合、これを行う最善の方法は、すべてのHTML応答にHTTPヘッダーを自動的に追加することだと思います。これを行う1つの方法は、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);
    }
}

アプリケーションごとにインスタンスが1つだけstaticInitなるように、モジュールがインスタンス化されていないことが重要であることに注意してください。もちろん、実際のアプリケーションでは、IoCコンテナがこれを管理しているはずです。

利点

  • この回答の冒頭で概説した問題を克服します。

短所

  • Webサイトの管理者は、ヘッダー値を制御できません。これは、新しいバージョンのInternet Explorerがリリースされ、Webサイトのレンダリングに悪影響を与える場合に問題になる可能性があります。ただし、これは、ハードコードされた値を使用する代わりに、モジュールにアプリケーションの構成ファイルからヘッダー値を読み取らせることで解決できます。
  • これは、ASP.NETMVCで機能するように変更する必要がある場合があります。
  • これは静的HTMLページでは機能しません。
  • PreSendRequestHeaders上記のコードのイベントは、IIS6では発生しないようです。このバグを解決する方法はまだわかりません。

2
あなたの答えが出るまでに1年以上かかったかもしれません、そして私が取り組んでいた実際のアプリは現在非推奨です。それにもかかわらず、これは間違いなく私が望むことができた最も徹底的でよく研究された答えです。良いものは、待っている人に来て:)感謝サム
JSancho

1
「これにより、ページが他のブラウザと一貫して、標準に準拠した方法でレンダリングされるようになります。」申し訳ありませんが、これは私の経験ではありません。現在、IE10ではすべてが間違っており、Chromeでは問題なく、IE10互換モードではほぼ問題がないSSRSレポートを使用しています。
BobRodes 2014年

@ BobRodes、IEの新しいバージョンはより標準に準拠しているはずなので、私はそれを書いたと思いますが、私は実際には経験から話していなかったので、良い点です!その主張を削除するために答えを更新しました。
サム

マイクロソフトは、競合他社との関係において「受け入れる、拡大する、消滅する」という概念を使用しています。まず、あらゆる種類の標準を採用します。次に、独自の機能を備えた標準を「改善」します。次に、将来のバージョンで標準のサポートを静かに終了します。幸いなことに、彼らはIEで問題を抱えています。:)
BobRodes 2014

これは私にとってはうまくいき、メタタグを含むいくつかの異なる解決策を試し、cssハックを使用して、ieで正しくレンダリングされなかったサイトの領域を説明しようとしました。
user609926 2016年

39

ヘッダーを次のように変更すると、問題が解決します。

<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />

また、Windows 2008サーバーで動作させるためにweb.configファイルにcustomerヘッダーを追加する必要がありました
Catch22 2016

17

更新:より有用な情報<meta http-equiv = "X-UA-Compatible" content = "IE = edge">は何をしますか?

たぶんこのURLはあなたを助けることができます:Doctypeでブラウザモードをアクティブにする

編集:今日、互換表示を次のように上書きすることができました: <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />


@Balanivashリンクをありがとう、それは実際に本当に良い読みでした。この記事では、サイトがイントラネットゾーン内にあるため、「互換モード」が有効になっていると思います。ただし、これは一貫して発生していません。たとえば、次のようになります。-クライアント上のwin7、IE8->完全な標準モード-同じ資格情報を持つ別のボックス上のwin7、IE8->互換モード安全を確保するためにmまた、ブラウザーの新しいセッションを開始し、すべてのテストでIE開発者ツールバーをデフォルト値にリセットします。
JSancho 2011

たぶんあなたはこれを試すことができます: <meta http-equiv="X-UA-Compatible" content="IE=8" />
Andrew

1
また、WebアプリケーションでIE8に本当に信頼するように指示する場合は、メタタグの代わりにX-UA-CompatibleをHTTPヘッダーとしてWebサーバーから送信する必要があります:social.msdn.microsoft.com/Forums/en- US / iewebdevelopment / thread /…
Andrew

2
実は今日はとの互換性ビューを上書きすることができました:<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
アンドリュー・

2
回答を更新していただきありがとうございます。互換モードを無効にすることIE=Edgeについての質問なので、あなたの答えを指定したほうがよいと思います。
サム

0

Node / Express開発者の場合、ミドルウェアを使用してサーバー経由でこれを設定できます。

app.use(function(req, res, next) {
  res.setHeader('X-UA-Compatible', 'IE=edge');
  next();
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.