programing

IE의 호환성 모드를 서버 측에서 강제로 해제하는 방법은 무엇입니까?

showcode 2023. 6. 9. 22:12
반응형

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 호환 태그를 사용하면 클라이언트의 호환성 보기가 재정의됩니다.

"문서 호환성 정의"를 위한 Google, 슬프게도 스팸 엔진은 제가 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가 호환 모드를 트리거하지 않고 항상 페이지를 렌더링하도록 강제하는 것이 가능합니까?

대단히 감사합니다.

자우메

PS: 이 사이트는 현재 개발 중이며 물론 마이크로소프트의 호환성 목록에 없지만, 만약을 위해 확인해 보았습니다.

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

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

  1. 정의로 이 합니다.<customHeaders>web.config의 )을 사용하면 동일한 응용 프로그램의 다른 배포에서 이 설정을 다르게 설정할 수 있습니다.저는 이것이 잘못될 수 있는 또 다른 것이라고 생각하기 때문에, 애플리케이션이 이것을 코드로 지정하는 것이 더 낫다고 생각합니다.또한 IIS6은 기능을 지원하지 않습니다.

  2. HTML »<meta>웹 양식 마스터 페이지 또는 MVC 레이아웃 페이지의 태그가 위보다 더 나은 것 같습니다.그러나 일부 페이지가 이 페이지에서 상속되지 않으면 태그를 복제해야 하므로 유지 관리 및 안정성 문제가 발생할 수 있습니다.

  3. 은 전만하네트줄일수다있니습래을픽송만 하면 줄일 수 있었습니다.X-UA-CompatibleInternet Explorer 클라이언트의 헤더입니다.

잘 구성된 애플리케이션

이 모든 하나의 에는 응프로그이페궁극로단으일경우상구록도성된속을 합니다.<meta>태그를 지정합니다.

레거시 응용 프로그램

그렇지 않으면 HTTP 헤더를 모든 HTML 응답에 자동으로 추가하는 것이 가장 좋은 방법이라고 생각합니다.이를 위한가지 방법은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);
    }
}

로 모듈이 "" "" "" "" 인 것은 합니다.static 에서 스않음지되화로 되지 않음Init응용 프로그램당 인스턴스가 하나만 있습니다.물론 실제 애플리케이션에서는 IoC 컨테이너가 이를 관리해야 합니다.

이점

  • 이 답변의 시작 부분에 요약된 문제를 해결합니다.

단점들

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

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

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

업데이트: 더 유용한 정보 <http-equiv="X-UA-Compatible" 콘텐츠의 기능="IE=edge"> 무엇을 합니까?

이 URL이 도움이 될 수 있습니다.Doctype을 사용하여 브라우저 모드 활성화

편집: 오늘은 다음을 통해 호환성 보기를 재정의할 수 있었습니다.<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />

Node/Express 개발자의 경우 미들웨어를 사용하고 서버를 통해 이를 설정할 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/6546775/how-to-forcefully-set-ies-compatibility-mode-off-from-the-server-side

반응형