Giá trị không hợp lệ X-UA-Tương thích với thuộc tính http-equiv trên meta phần tử


110

Tôi đã sử dụng cùng một metaHTML5 Boilerplate đang sử dụng và trình xác thực HTML W3C phàn nàn:

Giá trị không hợp lệ X-UA-Tương thích với thuộc tính http-equiv trên meta phần tử.

<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>

Có gì sai với metathẻ này ?


6
Đây là một bài viết trên blog tốt đẹp về nó (nó cũng là kết quả tìm kiếm đầu tiên tôi nhận được): blog.yjl.im/2011/01/...
ComFreek

Câu trả lời:


67

X-UA-Tương thích không phải là HTML "tiêu chuẩn" ("tiêu chuẩn" FSVO liên quan đến việc xuất hiện trên trang wiki có thể chỉnh sửa công khai được tham chiếu bởi thông số kỹ thuật) hoặc Trình xác thực không cập nhật trạng thái hiện tại của wiki đó.

Tại thời điểm viết bài (20130326) X-UA-Tương thích xuất hiện trên trang wiki trong phần có nội dung: "Các tiện ích mở rộng được đề xuất sau đây chưa tuân thủ tất cả các yêu cầu đăng ký trong thông số kỹ thuật HTML và do đó chưa được phép hợp lệ các tài liệu." Vì vậy, trình xác thực là chính xác để từ chối giá trị này.


8
Trang wiki sai. Một trong những bạn liên kết đến là cho <meta name= .... Đối với <meta http-equiv=...trang là wiki.whatwg.org/wiki/PragmaExtensions
Alohci

6
Trang wiki chính xác có chứa X-UA-Compatible, vì vậy lựa chọn thay thế “Trình xác thực không được cập nhật” sẽ áp dụng. Ngay cả validator.nu (được cho là cập nhật hơn nói chung) về mặt này cũng đã lỗi thời.
Jukka K. Korpela

Cảm ơn vì những sửa chữa. Tôi đã không nhận ra rằng các giá trị cho thuộc tính meta được chia thành hai trang.
Quentin

1
Xem câu trả lời của tôi để biết ví dụ về cách vá trình xác thực để hỗ trợ X-UA-Compatible. stackoverflow.com/a/21048010/1006963
darcyparker

vậy làm cách nào để khắc phục sự cố từ trình xác thực w3c..có thể xóa thẻ không?
Krish

42

Nếu bạn đang muốn làm cho nó hợp lệ về mặt kỹ thuật (mọi người đều thích nhìn thấy biểu tượng yêu thích màu xanh lá cây) có hiệu quả bất kỳ chức năng nào, bạn có thể chỉ cần bọc nó trong một thẻ "if IE".

<!--[if IE]><meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'><![endif]-->

22
Này có hiệu quả tắt hỗ trợ Khung Chrome của mình như Chrome Frame bỏ qua của IE bình luận có điều kiện, xem jeffreybarke.net/2010/08/...
Jasper Moelker

5
@JasperMoelker: có thể đáng nói rằng bài viết mà bạn đã cung cấp liên kết thực sự chứa một giải pháp tuyệt vời cho Chrome Frame: Xác thực + hỗ trợ Chrome Frame!
Luke

5
Không không không, điều này phá vỡ X-UA-Tương thích. xn--mlform-iua.no/blog/…
brentonstrine,

30

Một giải pháp khả thi là thực hiện sửa lỗi phía máy chủ trong tiêu đề, như được đề xuất trong bài viết hay này của Aaron Layton. (Tất cả tín dụng sẽ thuộc về anh ấy, và tôi sẽ diễn giải thay vì đạo văn ...)

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />

"Khi Internet Explorer đi qua dòng này, nó sẽ thay đổi công cụ đang được sử dụng cho Chrome Frame đầu tiên, nếu plugin được cài đặt, sau đó đến Edge (chế độ tài liệu được hỗ trợ cao nhất của trình duyệt)."

Các bước :

  • Sửa lỗi xác thực trang - Điều này đạt được chỉ bằng cách xóa thẻ
  • Tốc độ hiển thị - Thay vì đợi trình duyệt nhìn thấy thẻ và sau đó thay đổi chế độ, chúng tôi sẽ gửi trước chế độ chính xác dưới dạng tiêu đề phản hồi
  • Đảm bảo rằng chúng tôi chỉ hiển thị bản sửa lỗi cho Internet Explorer - Chúng tôi sẽ chỉ sử dụng một số phát hiện trình duyệt phía máy chủ và chỉ gửi nó tới IE

Để thêm tiêu đề trong PHP, chúng tôi có thể thêm phần này vào trang của mình:

if (isset($_SERVER['HTTP_USER_AGENT']) &&
    (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false))
        header('X-UA-Compatible: IE=edge,chrome=1');


Hoặc bạn có thể thêm nó vào tệp .htaccess của mình như sau:

<FilesMatch "\.(htm|html|php)$">
    <IfModule mod_headers.c>
        BrowserMatch MSIE ie
        Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie
    </IfModule>
</FilesMatch>


Liên kết đến bài viết gốc, kiểm tra các bình luận để biết những điều có thể xảy ra. Cũng bao gồm một triển khai cho C #.

Khắc phục giá trị xấu X-UA-Tương thích một lần và mãi mãi

Hi vọng điêu nay co ich!


1
Tại thời điểm viết bài này, giải pháp này được triển khai trong tệp .htaccess HTML5BP. Vì vậy, với điều kiện là máy chủ Apache của bạn đã bật mod_headers, bạn có thể an toàn khi xóa <meta>khỏi tệp html.
Patrick James McDougle,

Nếu bạn đang sử dụng Spring MVC, giống như tôi, thì nó vẫn khá dễ dàng để thực hiện. Bạn đang tìm kiếm:, response.addHeader("X-UA-Compatible", "IE=edge,chrome=1");nhưng đây là toàn bộ ý chính trên github .
Paul Nelson Baker

1
@PatrickJamesMcDougle Tôi đã phải bật cả mod headerssetenvifmod trên máy chủ Apache của mình để điều này hoạt động.
iglvzx

Nó có quan trọng nơi điều này được thêm vào không? Nó có nên là điều đầu tiên không?
Ở lại

1
Người bảo trì trình xác thực HTML W3C tại đây. Nếu bạn đặt "chrome = 1" vào giá trị, giải pháp trong câu trả lời này sẽ không hoạt động nữa, bởi vì chúng tôi cũng đã thêm kiểm tra cho tiêu đề (cùng với kiểm tra phần tử meta) và theo thông số kỹ thuật HTML, ở một trong hai vị trí (phần tử meta hoặc tiêu đề) giá trị được phép duy nhất là "IE = Edge".
sidehowbarker


2

.. đây có thể là một câu trả lời tốt?

Đặt tiêu đề HTTP bằng PHP:

Đây không phải là công việc của riêng tôi nhưng tôi hy vọng nó cũng hữu ích cho những người khác.


7
Lưu ý rằng các câu trả lời chỉ có liên kết không được khuyến khích (các liên kết có xu hướng cũ dần theo thời gian). Vui lòng xem xét chỉnh sửa câu trả lời của bạn và thêm tóm tắt ở đây.
bummi

1

Nếu bạn tải xuống / xây dựng mã src trình xác thực, bạn có thể tự thêm hỗ trợ.

Thêm phần sau vào tệp chẳng hạn như html5-meta-X-UA-Compatible.rnc) Sau đó đưa nó vào html5full.rnc.

Tôi đã làm điều này và nó hoạt động tốt để xác thực.

meta.http-equiv.X-UA-Compatible.elem =
  element meta { meta.inner & meta.http-equiv.X-UA-Compatible.attrs }
  meta.http-equiv.X-UA-Compatible.attrs =
    ( common.attrs.basic
      & common.attrs.i18n
      & common.attrs.present
      & common.attrs.other
      & meta.http-equiv.attrs.http-equiv.X-UA-Compatible
      & meta.http-equiv.attrs.content.X-UA-Compatible
      & ( common.attrs.aria.role.presentation
        | common.attrs.aria.role.menuitem
        )?
    )
    meta.http-equiv.attrs.http-equiv.X-UA-Compatible = attribute http-equiv {
      xsd:string {
        pattern = "X-UA-Compatible"
      }
    }
    meta.http-equiv.attrs.content.X-UA-Compatible = attribute content {
      xsd:string {
        pattern = "IE=((edge)|(EmulateIE(7|8|9|10))|7|8|9|10|11)(,chrome=(1|0))?"
      }
    }

common.elem.metadata |= meta.http-equiv.X-UA-Compatible.elem

0

Vui lòng xóa ,chrome=1khỏi thẻ meta nó sẽ hoạt động tốt. Với trình xác thực:

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

-1

Tôi đã gặp vấn đề tương tự và việc thêm và bao quanh toàn bộ dòng đó đã khắc phục được tình hình.

<!--[if IE]><meta http-equiv="x-ua-compatible" content="IE=9" /><![endif]-->

1
Có ai biết tại sao bị phản đối không? Nó thực sự làm cho trình xác nhận hoạt động bình thường.
Maciej Paprocki

2
Có lẽ vì nó không thực sự đạt được bất cứ điều gì. 1. Nhận xét có điều kiện không hoạt động trong IE10 trở lên. 2. X-UA-Tương thích là để làm cho các trình duyệt mới hơn mô phỏng các trình duyệt cũ hơn. Vì vậy, dòng này nói một cách hiệu quả là: 1. IE 10 & 11, hiển thị bằng chế độ mặc định (vì chúng không phân tích cú pháp có điều kiện nữa) 2. IE 9, hiển thị dưới dạng IE 9 (tức là chế độ mặc định của nó trong hầu hết các trường hợp). 3. IE <9, hiển thị bằng chế độ mặc định (vì chúng không thể mô phỏng một trình duyệt mới hơn hiện tại)
aleayr

Tôi cũng sẽ nói thêm rằng nó làm cho trình xác thực hoạt động 'bình thường' vì nó nằm bên trong một nhận xét (do đó trình xác thực bỏ qua nó).
aleayr
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.