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 for "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를 사용하여 헤더가 실제로 올바르게 삽입되고 있는지 확인했습니다.

내 이해는 이러한 설정을 사용하면 "호환성보기에서 인트라넷 사이트 표시"브라우저 설정을 재정의 할 수 있어야한다는 것입니다. 그러나 클라이언트에 따라 일부는 여전히 호환성 모드를 트리거한다는 것을 알았습니다. 또한 다른 클라이언트에서 동일한 자격 증명 집합을 사용하더라도 다른 결과를 얻으므로 정책 그룹 설정이 아니라 컴퓨터 수준으로 내려간 것 같습니다.

호환성보기 설정 확인란을 비활성화하면 문제가 해결됩니다. 그러나 실제 목적은 클라이언트 설정에 관계없이 앱이 정확히 동일한 방식으로 렌더링되도록하는 것입니다.

어떤 생각과 내가 놓칠 수있는 것이 무엇입니까? IE가 Compat 모드를 트리거하지 않고 항상 페이지를 렌더링하도록 강제 할 수 있습니까?

정말 고마워,

Jaume

추신 : 이 사이트는 현재 개발 중이며 물론 Microsoft의 호환성 목록에 없지만 만일을 대비하여 확인했습니다.

"호환성보기 목록 이해"를 위한 Google , 슬프게도 스팸 엔진은 2 개 이상의 URL을 게시 할 수 없습니다.

답변:


45

이 작업을 수행하는 두 가지 일반적인 방법에서 문제를 발견했습니다.

  1. <customHeaders>web.config에서 사용자 지정 헤더 ( ) 로이 작업을 수행하면 동일한 응용 프로그램의 여러 배포에서이 설정을 다르게 설정할 수 있습니다. 나는 이것이 잘못 될 수있는 또 하나의 것으로 생각하므로 애플리케이션이 이것을 코드에서 지정하는 것이 더 낫다고 생각합니다. 또한 IIS6는 이것을 지원하지 않습니다 .

  2. <meta>Web Forms 마스터 페이지 또는 MVC 레이아웃 페이지에 HTML 태그를 포함하는 것이 위의 것보다 낫습니다. 그러나 일부 페이지가 이러한 페이지에서 상속되지 않으면 태그를 복제해야하므로 잠재적 인 유지 관리 및 안정성 문제가 있습니다.

  3. 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. 물론 실제 애플리케이션에서는 IoC 컨테이너가이를 관리해야합니다.

장점

  • 이 답변의 시작 부분에 설명 된 문제를 극복합니다.

단점

  • 웹 사이트 관리자는 헤더 값을 제어 할 수 없습니다. 새로운 버전의 Internet Explorer가 출시되어 웹 사이트 렌더링에 부정적인 영향을 미칠 경우 문제가 될 수 있습니다. 그러나 이는 하드 코딩 된 값을 사용하는 대신 모듈이 응용 프로그램의 구성 파일에서 헤더 값을 읽도록함으로써 극복 할 수 있습니다.
  • ASP.NET MVC에서 작동하려면 수정이 필요할 수 있습니다.
  • 정적 HTML 페이지에서는 작동하지 않습니다.
  • PreSendRequestHeaders위 코드 의 이벤트는 IIS6에서 발생하지 않는 것 같습니다. 이 버그를 해결하는 방법을 아직 찾지 못했습니다.

2
답변이 나오기까지 1 년 이상 걸렸을 수 있으며 제가 작업 중이던 실제 앱은 이제 더 이상 사용되지 않습니다. 그럼에도 불구하고 이것은 내가 바랄 수 있었던 가장 철저하고 잘 연구 된 답변입니다. 기다리는 사람들에게 좋은 일이 온다 :) 감사합니다 Sam
JSancho

1
"이렇게하면 페이지가 다른 브라우저와 표준을 준수하는 방식으로 일관되게 렌더링됩니다." 미안하지만, 이것은 적어도 내 경험이 아닙니다. 지금은 IE10에서 모두 잘못 렌더링되고 Chrome에서는 잘, IE10 호환성 모드에서는 거의 잘 표시되는 SSRS 보고서를 작성하고 있습니다.
BobRodes 2014

@BobRodes, 나는 IE의 최신 버전이 더 표준을 준수해야하기 때문에 내가 쓴 것 같다. 그러나 나는 실제로 경험으로 말하지 않았기 때문에 좋은 지적이다! 해당 주장을 제거하기 위해 답변을 업데이트했습니다.
Sam

Microsoft는 경쟁사와의 관계에서 "포용, 확장, 소멸"이라는 개념을 사용합니다. 첫째, 모든 종류의 표준을 수용하십시오. 그런 다음 독점적 특징과 기능으로 표준을 "개선"하십시오. 그런 다음 차후 버전에서 표준에 대한 지원을 조용히 중단합니다. 다행히도 그들은 IE에서 문제를 겪고 있습니다. :)
BobRodes 2014-12-05

이것은 나를 위해 일했으며 메타 태그를 포함하여 여러 가지 솔루션을 시도하고 ie에서 잘못 렌더링되지 않은 사이트 영역을 설명하기 위해 CSS 해킹을 시도했습니다.
user609926

39

내 헤더를 다음으로 변경하면 문제가 해결됩니다.

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

또한 web.config 파일에 고객 헤더를 추가하여 Windows 2008 서버에서 작동하도록해야했습니다
Catch22

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

어쩌면 당신이 시도 할 수 있습니다 : <meta http-equiv="X-UA-Compatible" content="IE=8" />
앤드류

1
또한 : 웹 응용 프로그램이 IE8에 사용자를 정말로 신뢰하도록하려면 X-UA-Compatible을 메타 태그 대신 웹 서버에서 HTTP 헤더로 보내야합니다
Andrew

2
실제로 오늘 우리는 다음으로 호환성보기를 재정의 할 수있었습니다.<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
Andrew

2
답변을 업데이트 해 주셔서 감사합니다. IE=Edge질문이 호환성 모드 비활성화 에 관한 것이기 때문에 답변을 지정하면 더 좋을 것이라고 생각 합니다.
Sam

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.