web-dev-qa-db-ja.com

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

Google for "Defining Document Compatibility"、残念ながらSPAMエンジンでは2つ以上のURLを投稿できません。

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

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

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

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

何か考えがあり、私がおそらく見逃しているものは何ですか? CompatモードをトリガーせずにIEにページを常にレンダリングさせることはまったく可能ですか?

感謝万円、

ジャウメ

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

Google for「互換表示リストについて」、残念ながらSPAMエンジンでは2つ以上のURLを投稿できません。

83
JSancho

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

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

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

  3. X-UA-CompatibleヘッダーのみをInternet Explorerクライアントに送信することにより、ネットワークトラフィックを削減できます。

構造化されたアプリケーション

すべてのページが最終的に単一のルートページから継承されるようにアプリケーションが構成されている場合、 その他の回答 に示すように<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);
    }
}

モジュールがstaticであり、Initでインスタンス化されないことが重要であるため、アプリケーションごとに1つのインスタンスのみが存在することに注意してください。もちろん、実際のアプリケーションでは、おそらくIoCコンテナーがこれを管理しているはずです。

長所

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

欠点

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

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

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

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

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

編集:本日、互換ビューを<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />でオーバーライドできました。

17
Andrew

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

app.use(function(req, res, next) {
  res.setHeader('X-UA-Compatible', 'IE=Edge');
  next();
});
0
mbokil