Làm cách nào để tắt Chế độ tương thích của IE từ phía máy chủ?


84

Trong môi trường do miền kiểm soát, tôi thấy rằng chế độ tương thích được kích hoạt trên một số ứng dụng khách nhất định (winXP / Win7, IE8 / IE9) ngay cả khi chúng tôi cung cấp thẻ X-UA, định nghĩa a! DOCTYPE và phản hồi "IE = Edge" tiêu đề. Các ứng dụng khách này được đánh dấu vào hộp kiểm "hiển thị các trang web mạng nội bộ trong chế độ xem tương thích". Đó chính xác là những gì tôi đang cố gắng ghi đè.

Sau đây là tài liệu mà tôi đã sử dụng để thử hiểu cách IE quyết định thực sự kích hoạt chế độ tương thích.

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

Chủ sở hữu trang web luôn kiểm soát nội dung của họ. Chủ sở hữu trang web có thể chọn sử dụng thẻ Tương thích X-UA để hoàn toàn khai báo về cách họ muốn trang web của mình hiển thị và ánh xạ các trang ở chế độ Tiêu chuẩn với Tiêu chuẩn IE7. Việc sử dụng thẻ Tương thích X-UA sẽ ghi đè Chế độ xem tương thích trên máy khách.

Google cho "Xác định khả năng tương thích của tài liệu" , thật đáng tiếc là công cụ SPAM không cho phép tôi đăng nhiều hơn 2 url.

Đây là một ASP .NETứng dụng web và bao gồm các định nghĩa sau trên trang chính:

<!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>

Tôi đã sử dụng Fiddler để kiểm tra xem tiêu đề có thực sự được đưa vào chính xác hay không.

Tôi hiểu rằng với những cài đặt này, tôi có thể ghi đè cài đặt trình duyệt "Hiển thị các trang web mạng nội bộ trong Chế độ xem tương thích". Nhưng tùy thuộc vào khách hàng, tôi thấy rằng một số trong số họ vẫn sẽ kích hoạt chế độ tương thích. Nó cũng dường như nằm ở cấp độ máy chứ không phải là cài đặt nhóm chính sách, vì tôi nhận được các kết quả khác nhau ngay cả khi tôi sử dụng với cùng một bộ thông tin xác thực trên các máy khách khác nhau.

Vô hiệu hóa hộp kiểm Cài đặt Chế độ xem Tương thích thực hiện một mẹo nhỏ. Nhưng mục đích thực tế là để đảm bảo rằng ứng dụng được hiển thị theo cùng một cách bất kể cài đặt ứng dụng khách là gì.

Bất kỳ suy nghĩ và những gì tôi có thể có thể thiếu? Có thể nào buộc IE luôn hiển thị các trang mà không kích hoạt chế độ Compat không?

cảm ơn rất nhiều,

Jaume

Tái bút: trang web hiện đang được phát triển và tất nhiên không nằm trong danh sách tương thích của Microsoft, nhưng tôi cũng đã kiểm tra đề phòng.

Google cho "Tìm hiểu Danh sách Chế độ xem Tương thích" , thật đáng tiếc là công cụ SPAM không cho phép tôi đăng nhiều hơn 2 url.

Câu trả lời:


45

Tôi thấy có vấn đề với hai cách phổ biến để thực hiện việc này:

  1. Thực hiện điều này với các tiêu đề tùy chỉnh ( <customHeaders>) trong web.config cho phép các triển khai khác nhau của cùng một ứng dụng có bộ này khác nhau. Tôi thấy đây là một điều nữa có thể xảy ra sai sót, vì vậy tôi nghĩ sẽ tốt hơn nếu ứng dụng chỉ định điều này trong mã. Ngoài ra, IIS6 không hỗ trợ điều này .

  2. Bao gồm một <meta>thẻ HTML trong Trang chính của Biểu mẫu Web hoặc Trang Bố cục MVC có vẻ tốt hơn so với những cách trên. Tuy nhiên, nếu một số trang không kế thừa từ những thứ này thì thẻ cần được sao chép, do đó có thể xảy ra vấn đề về khả năng bảo trì và độ tin cậy.

  3. Lưu lượng mạng có thể được giảm bớt bằng cách chỉ gửi X-UA-Compatibletiêu đề đến các máy khách Internet Explorer.

Các ứng dụng có cấu trúc tốt

Nếu ứng dụng của bạn được cấu trúc theo cách khiến tất cả các trang cuối cùng kế thừa từ một trang gốc, hãy bao gồm <meta>thẻ như được hiển thị trong các câu trả lời khác .

Ứng dụng kế thừa

Nếu không, tôi nghĩ cách tốt nhất để làm điều này là tự động thêm tiêu đề HTTP vào tất cả các phản hồi HTML. Một cách để làm điều này là sử dụng 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 chỉ ra rằng IE nên sử dụng công cụ kết xuất mới nhất (thay vì chế độ tương thích) để hiển thị trang.

Có vẻ như các mô-đun HTTP thường được đăng ký trong tệp web.config, nhưng điều này đưa chúng ta trở lại vấn đề đầu tiên. Tuy nhiên, bạn có thể đăng ký chúng theo chương trình trong Global.asax như sau:

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);
    }
}

Lưu ý rằng điều quan trọng là mô-đun staticphải được khởi tạo và không được khởi tạo Initđể chỉ có một phiên bản cho mỗi ứng dụng. Tất nhiên, trong một ứng dụng thế giới thực, vùng chứa IoC có thể sẽ quản lý điều này.

Ưu điểm

  • Khắc phục các vấn đề được nêu ở đầu câu trả lời này.

Nhược điểm

  • Quản trị viên trang web không có quyền kiểm soát giá trị tiêu đề. Đây có thể là một vấn đề nếu một phiên bản Internet Explorer mới ra mắt và ảnh hưởng xấu đến việc hiển thị trang web. Tuy nhiên, điều này có thể được khắc phục bằng cách để mô-đun đọc giá trị tiêu đề từ tệp cấu hình của ứng dụng thay vì sử dụng giá trị được mã hóa cứng.
  • Điều này có thể yêu cầu sửa đổi để hoạt động với ASP.NET MVC.
  • Điều này không hoạt động đối với các trang HTML tĩnh.
  • Sự PreSendRequestHeaderskiện trong đoạn mã trên dường như không kích hoạt trong IIS6. Tôi vẫn chưa tìm ra cách giải quyết lỗi này.

2
Có thể mất hơn một năm để câu trả lời của bạn xuất hiện và ứng dụng thực tế mà tôi đang làm việc hiện không được dùng nữa. Tuy nhiên, đây chắc chắn là câu trả lời được nghiên cứu kỹ lưỡng nhất mà tôi có thể hy vọng. Những điều tốt đẹp sẽ đến với những ai biết chờ đợi :) cảm ơn Sam
JSancho

1
"Điều này sẽ đảm bảo trang được hiển thị nhất quán với các trình duyệt khác và theo cách tuân thủ các tiêu chuẩn." Tôi xin lỗi, nhưng đây không phải là kinh nghiệm của tôi. Hiện tại, tôi đang làm việc với một báo cáo SSRS hiển thị tất cả sai trong IE10, chỉ ổn trong Chrome và khá ổn ở chế độ tương thích IE10.
BobRodes

@BobRodes, tôi nghĩ rằng tôi đã viết điều đó bởi vì các phiên bản IE sau này được cho là tuân thủ các tiêu chuẩn hơn, nhưng tôi không thực sự nói từ kinh nghiệm, rất tốt! Tôi vừa cập nhật câu trả lời để xóa khiếu nại đó.
Sam

Microsoft sử dụng một khái niệm "bao trùm, mở rộng, dập tắt" trong quan hệ của mình với các đối thủ cạnh tranh. Đầu tiên, hãy nắm lấy bất kỳ loại tiêu chuẩn nào. Sau đó, "cải tiến" trên tiêu chuẩn với các tính năng và chức năng độc quyền. Sau đó, lặng lẽ bỏ hỗ trợ cho tiêu chuẩn trong các phiên bản tương lai. May mắn thay, họ đang gặp sự cố với IE. :)
BobRodes

Điều này phù hợp với tôi và tôi đã thử một số giải pháp khác nhau bao gồm cả thẻ meta và cố gắng sử dụng css hack để giải thích các khu vực của trang web không hiển thị sai.
user609926

39

Thay đổi tiêu đề của tôi thành tiêu đề sau sẽ giải quyết được vấn đề:

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

Tôi cũng cần thiết để thêm tiêu đề của khách hàng vào file web.config để làm cho nó hoạt động trên Windows 2008 server
Catch22

17

Cập nhật: Thông tin hữu ích hơn <meta http-equiv = "X-UA-Compractive" content = "IE = edge"> làm gì?

Có thể url này có thể giúp bạn: Kích hoạt chế độ trình duyệt với Doctype

Chỉnh sửa: Hôm nay chúng tôi có thể ghi đè chế độ xem tương thích với: <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />


@Balanivash Thực sự là một bài đọc rất hay, cảm ơn vì liên kết. Bài báo khiến tôi tin rằng "Chế độ tương thích" đang được bật vì trang web nằm trong vùng mạng nội bộ. Tuy nhiên, điều này không xảy ra nhất quán, ví dụ: - win7, IE8, trên máy khách -> chế độ tiêu chuẩn đầy đủ - win7, IE8, trên một hộp khác có cùng thông tin xác thực -> chế độ so sánh Để ở bên an toàn I ' m cũng bắt đầu các phiên mới của trình duyệt và đặt lại thanh công cụ dành cho nhà phát triển IE về các giá trị mặc định trong mỗi lần kiểm tra.
JSancho

Có thể bạn có thể thử điều này: <meta http-equiv="X-UA-Compatible" content="IE=8" />
Andrew

1
Ngoài ra: Nếu bạn muốn ứng dụng web của mình cho IE8 thực sự tin tưởng bạn, bạn cần gửi X-UA-Tương thích làm tiêu đề HTTP từ máy chủ web của bạn thay vì thẻ meta: social.msdn.microsoft.com/Forums/en- US / iewebdevelopment / thread /…
Andrew

2
Trên thực tế, hôm nay chúng tôi đã có thể ghi đè chế độ xem tương thích với:<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
Andrew

2
Cảm ơn đã cập nhật câu trả lời của bạn. Tôi nghĩ sẽ tốt hơn nếu câu trả lời của bạn được chỉ định IE=Edgevì câu hỏi là về việc tắt chế độ tương thích.
Sam

0

Đối với các nhà phát triển Node / Express, bạn có thể sử dụng phần mềm trung gian và thiết lập phần mềm này thông qua máy chủ.

app.use(function(req, res, next) {
  res.setHeader('X-UA-Compatible', 'IE=edge');
  next();
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.