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 ですが、残念ながら、スパム エンジンにより、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 を使用して、ヘッダーが実際に正しく挿入されていることを確認しました。

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

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

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

どうもありがとう、

ジャウメ

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

「互換表示リストの理解」についてはGoogle ですが、残念ながらスパム エンジンにより、2 つ以上の URL を投稿することはできません。

4

4 に答える 4

45

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

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

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

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

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

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

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

それ以外の場合、これを行う最善の方法は、HTTP ヘッダーをすべての HTML 応答に自動的に追加することだと思います。これを行う 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=edgeIE が (互換モードではなく) 最新のレンダリング エンジンを使用してページをレンダリングする必要があることを示します。

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 つだけになるように、モジュールがstaticインスタンス化されている場合とインスタンス化されていないことが重要であることに注意してください。Initもちろん、実際のアプリケーションでは、IoC コンテナーがこれを管理する必要があります。

利点

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

短所

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

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

<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
于 2012-04-04T13:19:58.260 に答える
17

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

たぶん、この URL が役に立ちます: Doctype でブラウザ モードを有効にする

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

于 2011-07-01T11:33:02.310 に答える
0

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

app.use(function(req, res, next) {
  res.setHeader('X-UA-Compatible', 'IE=edge');
  next();
});
于 2017-06-10T09:46:49.400 に答える