सर्वर-साइड से IE की संगतता मोड को जबरदस्ती कैसे सेट करें?


84

एक डोमेन-नियंत्रित वातावरण में मुझे पता चलता है कि संगतता मोड कुछ क्लाइंट (winXP / Win7, IE8 / IE9) पर ट्रिगर होता है, तब भी जब हम X-UA टैग प्रदान कर रहे हैं, DOCTYPE परिभाषा और "IE" एज "प्रतिक्रिया! हेडर। इन ग्राहकों के पास "संगतता दृश्य में इंट्रानेट साइटें" चेकबॉक्स टिक गया है। जो ठीक है मैं ओवरराइड करने की कोशिश कर रहा हूं।

निम्नलिखित प्रलेखन है जिसे मैंने समझने की कोशिश की है कि 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- संगत टैग का उपयोग करने के लिए चुन सकते हैं कि वे अपनी साइट को प्रदर्शित करने के लिए और IE7 मानकों के लिए मानक मोड पेजों को कैसे मैप करना चाहते हैं, इस बारे में पूरी तरह से घोषणात्मक हैं। X-UA- संगत टैग का उपयोग क्लाइंट पर संगतता दृश्य को ओवरराइड करता है।

"दस्तावेज़ संगतता को परिभाषित" करने के लिए Google , दुख की बात है कि स्पैम इंजन ने मुझे 2 से अधिक यूआरएल पोस्ट नहीं करने दिए।

यह एक 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>

मैंने फिडलर का उपयोग यह जांचने के लिए किया है कि हेडर वास्तव में सही तरीके से इंजेक्ट किया जा रहा है।

मेरी समझ यह है कि इन सेटिंग्स के साथ मुझे "इंट्रस्ट कंटेस्ट साइट्स इन कम्पेटिबिलिटी व्यू" ब्राउजर सेटिंग को ओवरराइड करने में सक्षम होना चाहिए। लेकिन ग्राहक के आधार पर मैंने पाया है कि उनमें से कुछ अभी भी संगतता मोड को ट्रिगर करेंगे। यह भी मशीन स्तर के बजाय एक नीति समूह की स्थापना के लिए नीचे लगता है, क्योंकि मैं अलग-अलग क्लाइंट्स पर समान क्रेडेंशियल्स के एक ही सेट के साथ उपयोग करने पर भी अलग-अलग परिणाम प्राप्त करता हूं।

संगतता दृश्य सेटिंग्स चेकबॉक्स को अक्षम करने से यह ट्रिक काम करती है। लेकिन वास्तविक उद्देश्य यह सुनिश्चित करना है कि ऐप ग्राहक सेटिंग्स की परवाह किए बिना बिल्कुल उसी तरह प्रस्तुत किया गया है।

किसी भी विचार और क्या मैं संभवतः गायब हो सकता है? क्या यह संभव है कि IE को मजबूर करने के लिए हमेशा संगत मोड को ट्रिगर किए बिना पृष्ठों को प्रस्तुत करना चाहिए?

बहुत - बहुत धन्यवाद,

Jaume

पुनश्च: साइट वर्तमान में विकास में है और निश्चित रूप से Microsoft की संगतता सूची में नहीं है, लेकिन मैंने अभी मामले में जाँच की है।

Google "संगतता दृश्य सूची को समझना" के लिए , दुख की बात है कि स्पैम इंजन ने मुझे 2 से अधिक यूआरएल पोस्ट नहीं करने दिए।

जवाबों:


45

मुझे ऐसा करने के दो सामान्य तरीकों से समस्याएँ मिलीं:

  1. <customHeaders>Web.config में कस्टम हेडर ( ) के साथ ऐसा करने से एक ही एप्लिकेशन के अलग-अलग परिनियोजन इस सेट को अलग तरीके से कर सकते हैं। मैं इसे एक और चीज के रूप में देखता हूं जो गलत हो सकता है, इसलिए मुझे लगता है कि यह बेहतर है यदि एप्लिकेशन इसे कोड में निर्दिष्ट करता है। इसके अलावा, IIS6 इसका समर्थन नहीं करता है

  2. <meta>वेब फॉर्म मास्टर पेज या एमवीसी लेआउट पेज में एक HTML टैग शामिल करना उपरोक्त से बेहतर लगता है। हालाँकि, यदि कुछ पृष्ठ इनसे विरासत में नहीं मिलते हैं, तो टैग को डुप्लिकेट करने की आवश्यकता है, इसलिए एक संभावित स्थिरता और विश्वसनीयता की समस्या है।

  3. नेटवर्क ट्रैफ़िक को केवल X-UA-CompatibleInternet 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कि तत्काल किया गया है ताकि प्रति आवेदन केवल एक ही उदाहरण हो। बेशक, एक वास्तविक दुनिया के आवेदन में आईओसी कंटेनर को संभवतः इसका प्रबंधन करना चाहिए।

लाभ

  • इस उत्तर की शुरुआत में उल्लिखित समस्याओं पर काबू पा लेता है।

नुकसान

  • हेडर मूल्य पर वेबसाइट के प्रवेश का नियंत्रण नहीं है। यह एक समस्या हो सकती है यदि इंटरनेट एक्सप्लोरर का एक नया संस्करण सामने आता है और वेबसाइट के प्रतिपादन पर प्रतिकूल प्रभाव डालता है। हालाँकि, मॉड्यूल को हार्ड-कोडित मान का उपयोग करने के बजाय एप्लिकेशन के कॉन्फ़िगरेशन फ़ाइल से हेडर मान को पढ़ने से दूर किया जा सकता है।
  • इसके लिए ASP.NET MVC के साथ काम करने के लिए संशोधन की आवश्यकता हो सकती है।
  • यह स्थिर HTML पृष्ठों के लिए काम नहीं करता है।
  • PreSendRequestHeadersउपरोक्त कोड की घटना IIS6 में आग नहीं लगती है। मुझे समझ नहीं आया कि इस बग को कैसे सुलझाया जाए।

2
आपका उत्तर आने में एक वर्ष से अधिक समय लग सकता है, और जिस वास्तविक ऐप पर मैं काम कर रहा था, वह अब पदावनत हो गया है। फिर भी, यह निश्चित रूप से सबसे गहन और अच्छी तरह से शोधित उत्तर है जिसकी मैं उम्मीद कर सकता था। अच्छी चीजें उन लोगों के लिए आती हैं जो प्रतीक्षा करते हैं :) धन्यवाद सैम
JSancho

1
"यह सुनिश्चित करना चाहिए कि पृष्ठ अन्य ब्राउज़रों के साथ और मानकों के अनुरूप तरीके से लगातार प्रदान किया जाता है।" मुझे खेद है, लेकिन यह कम से कम मेरा अनुभव नहीं रहा है। अभी, मैं एक SSRS रिपोर्ट के साथ काम कर रहा हूं जो IE10 में सभी गलत तरीके से प्रस्तुत करता है, क्रोम में ठीक है, और IE10 संगतता मोड में बस ठीक है।
BobRodes

@BusRodes, मुझे लगता है कि मैंने लिखा है कि क्योंकि बाद के IE के संस्करणों को अधिक मानकों के अनुरूप माना जाता है, लेकिन मैं वास्तव में अनुभव से नहीं बोल रहा था, इसलिए अच्छा बिंदु! मैंने सिर्फ उस दावे को हटाने के लिए उत्तर को अपडेट किया।
सैम

Microsoft अपने प्रतिद्वंद्वियों के साथ अपने संबंधों में "आलिंगन, विस्तार, बुझाने" की अवधारणा का उपयोग करता है। सबसे पहले, किसी भी प्रकार के मानक को गले लगाओ। फिर, मालिकाना सुविधाओं और कार्यों के साथ मानक पर "सुधार"। फिर, भविष्य के संस्करणों में मानक के लिए चुपचाप समर्थन छोड़ दें। सौभाग्य से, वे IE के साथ उस से परेशान हैं। :)
BobRodes

इसने मेरे लिए काम किया और मैंने मेटा टैग सहित कई अलग-अलग समाधानों की कोशिश की और साइट के उन क्षेत्रों के लिए सीएसएस हैक्स का उपयोग करने का प्रयास किया जो गलत तरीके से प्रतिपादन नहीं कर रहे थे।
user609926

39

समस्या को हल करने के लिए मेरे हेडर को बदलना:

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

मुझे Windows 2008 सर्वर पर काम करने के लिए ग्राहक हेडर को web.config फ़ाइल में जोड़ने की भी आवश्यकता थी
Catch22

17

अपडेट: अधिक उपयोगी जानकारी <मेटा-इक्विव = "X-UA- संगत" सामग्री = "IE = एज"> क्या करता है?

हो सकता है कि यह url आपकी मदद कर सके: Doctype वाले Browser Modes को सक्रिय करना

संपादित करें: आज हम संगतता दृश्य को ओवरराइड करने में सक्षम थे: <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />


@ बालनिवाश वास्तव में अच्छा पढ़ा गया था, इस लिंक के लिए धन्यवाद। लेख मुझे विश्वास दिलाता है कि "संगतता मोड" सक्षम किया जा रहा है क्योंकि साइट इंट्रानेट ज़ोन के भीतर स्थित है। हालाँकि, यह लगातार नहीं हो रहा है, उदाहरण के लिए: - win7, IE8, क्लाइंट पर -> पूर्ण मानक मोड - win7, IE8, समान क्रेडेंशियल्स के साथ एक अलग बॉक्स पर -> कंपेटिटिव मोड सुरक्षित-साइड I पर होना ' मी ब्राउज़र के नए सत्र भी शुरू कर रहा है और IE डेवलपर टूलबार को हर परीक्षण पर डिफ़ॉल्ट मानों पर रीसेट कर रहा है।
१२:०an पर जेसनचो

शायद आप यह कोशिश कर सकते हैं: <meta http-equiv="X-UA-Compatible" content="IE=8" />
एंड्रयू

1
इसके अलावा: यदि आप चाहते हैं कि आपका वेब एप्लिकेशन IE8 को वास्तव में आप पर भरोसा करने के लिए कहे
एंड्रयू

2
वास्तव में आज हम संगतता दृश्य को ओवरराइड करने में सक्षम थे:<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
एंड्रयू

2
अपना उत्तर अपडेट करने के लिए धन्यवाद। मुझे लगता है कि यह बेहतर होगा यदि आपका उत्तर निर्दिष्ट हो IE=Edgeक्योंकि प्रश्न संगतता मोड को अक्षम करने के बारे में है।
सैम

0

नोड / एक्सप्रेस डेवलपर्स के लिए आप मिडलवेयर का उपयोग कर सकते हैं और इसे सर्वर के माध्यम से सेट कर सकते हैं।

app.use(function(req, res, next) {
  res.setHeader('X-UA-Compatible', 'IE=edge');
  next();
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.