मैं IIS7 से ईटैग हेडर कैसे निकालूं?


83

उच्च प्रदर्शन वेब साइटों के लिए याहू की सर्वोत्तम प्रथाओं के अनुसार , मैं अपने हेडर से Etags को हटाना चाहता हूं (मैं मैन्युअल रूप से अपने सभी कैशिंग को प्रबंधित कर रहा हूं और Etags की कोई आवश्यकता नहीं है ... और जब / अगर मुझे खेत में स्केल करने की आवश्यकता हो, तो मैं वास्तव में उन्हें पसंद करूँगा)। मैं Windows Server 2008 पर IIS7 चला रहा हूं। कोई भी जानता है कि मैं यह कैसे कर सकता हूं?


यह कम से कम IIS 8.0 के लिए काम करता है जैसा कि इस पोस्ट के दूसरे उत्तर में दिखाया गया है: stackoverflow.com/questions/7947420/…
RBT

जवाबों:


39

IIS7 के तहत Etag परिवर्तन संख्या (Etag का हिस्सा निम्नलिखित है) हमेशा 0 पर सेट है।

इसलिए सर्वर से Etag अब उसी फ़ाइल के लिए सर्वर से सर्वर में भिन्न नहीं होता है और इसलिए Yahoo सर्वोत्तम अभ्यास अब वास्तव में लागू नहीं होता है।

चूंकि आप वास्तव में IIS7 पर ईटैग हेडर को दबा नहीं सकते हैं, इसलिए संभवत: यह सबसे अच्छा होगा कि आप इसके साथ बिल्कुल न हों। मैंने अब तक सबसे उपयोगी विन्यास नियम पाया है "यदि डिफ़ॉल्ट कुछ तोड़ता नहीं है, तो उसे अकेला छोड़ दें"।


2
मैं एक अलग कारण के लिए etags को मारने के लिए परीक्षा में हूँ: जब तक मैं चीजों को गलत नहीं कर रहा हूँ, मैं IIS को एक ही सर्वर पर देख रहा हूं कि मेरी फ़ाइल होने के बावजूद etags के पहले घटक को बदल दें (अर्थात तथाकथित "फ़िल्टिमेस्टैम्प") संशोधित। उदाहरण के लिए, एक फ़ाइल का नवीनतम संस्करण ब्राउज़र में होगा, ब्राउज़र 'इफ-नो-नो-मैच: "01cc3a8acccc1: 0" /' अगर-संशोधित-चूंकि: शुक्र, 06 जनवरी 2012 00:32 24 GMT ', और IIS' ETag: "b6baeea8acccc1: 0" / '' अंतिम-संशोधित: शुक्र, 06 जनवरी 2012 00:32:24 GMT 'के साथ प्रतिक्रिया देगा। ये js files w / URLs जैसे foo.js? Rev = xxx हैं, हर बार एक ही xxx पास करते हैं।
क्रिस

@ क्रिस: मैं लगभग एक ही बात करता हूं, मैं जेएस फाइलों को कैश करने की अनुमति देता हूं और केवल एक्सएक्सएक्स को बदल देता हूं जब फाइल बदल जाती है। मैं यह नहीं कह सकता कि मैंने कभी भी उस व्यवहार का सामना किया है जो आप IIS के किसी संस्करण पर देख रहे हैं। आपके आईआई कॉन्फिगर पर कुछ अजीब सा है मुझे शक है।
एंथनीवजोन

धन्यवाद। जहाँ तक आप जानते हैं, क्या केवल फ़ाइल के टाइमस्टैम्प के आधार पर etags के "फिलेटिमस्टैम्प" का अनुरोध किया जा रहा है, और मशीन / प्रक्रिया / आवेदन की स्थिति के बारे में कुछ भी नहीं है?
क्रिस

@ क्रिस: जहां तक ​​मुझे पता है हां ई-टैग केवल फ़ाइल समय पर आधारित है। मैंने अपने सर्वर के साथ चक्कर लगाने की कोशिश की है और मैं आपके द्वारा देखी जा रही समस्या को पुन: उत्पन्न नहीं कर सकता।
एंथनीवजोन

मुझे नहीं पता कि सर्वर को गैर-परिवर्तनीय बनाना बुद्धिमान नीति है। के अतिरिक्त। मैं दूर-भविष्य की समाप्ति का परीक्षण कर रहा हूं और मैं बस एक HTTP 304 प्रतिक्रिया नहीं चाहता हूं - कभी भी। मैं चीजों को एक looooong समय के लिए कैश में रहना चाहता हूं क्योंकि मुझे पता है कि वे संपत्ति शायद ही कभी बदलती हैं। HTTP कल्पना RFC 2616 सहित IETF के बहुत सारे दस्तावेज हैं जो यह बताते हैं कि इसे साइट व्यवस्थापक के रूप में किया जाना चाहिए क्योंकि उस व्यक्ति को अपनी स्थिति का बेहतर पता चल जाएगा। कार्यान्वयनकर्ता हमेशा "जंगली" में हो रहे व्हाट्सएप की तलाश में रहते हैं।
जोश रॉबिन्सन

33

आपको लगता है कि web.config में ऐसा करना IIS7 में ETags को निष्क्रिय करने के लिए काम करेगा। लेकिन स्निफर ट्रेस इस बात की पुष्टि करता है कि ETag को वैसे भी नीचे भेजा गया है।

<httpProtocol>
    <customHeaders>
        <remove name="ETag" />
    </customHeaders>
</httpProtocol>

रिक्त का उपयोग करना या तो काम नहीं करता है। ETag को वैसे भी नीचे भेजा जाता है।

<httpProtocol>
    <customHeaders>
        <add name="ETag" value="" />
    </customHeaders>
</httpProtocol>

ETag को रिक्त कोट्स में सेट करना क्योंकि अन्य साइटों ने सुझाव दिया है कि यह काम नहीं करता है।

<httpProtocol>
    <customHeaders>
        <add name="ETag" value="&quot;&quot;" />
    </customHeaders>
</httpProtocol>

नीचे भेजे जाने के लिए और अधिक ETag का कारण बनता है:

ETag: "8ee1ce1acf18ca1: 0", ""

अंत में, आईआईएस 7 पर ईटैग को मारने के लिए कुछ भी मैं कोशिश नहीं कर सकता या सोच सकता हूं, कम से कम कस्टम मॉड्यूल आदि लिखने के बिना।


2
मैंने इस जेफ की पुष्टि नहीं की है, लेकिन ऐसा इसलिए हो सकता है क्योंकि httpProtocol अनुभाग वेबसाइट के स्तर पर बंद है। मुझे यह मामला तब मिला जब मैं web.config फ़ाइल के माध्यम से iis7 संपीड़न स्तर को प्रोग्रामेटिक रूप से सेट करने का प्रयास कर रहा था । मुझे अंत में रूट सर्वर स्तर पर उस अनुभाग को अनलॉक करना पड़ा । शायद इस खंड में एक ही समस्या है? (मैं वास्तव में सभी IIS सेटिंग्स जीयूआई के माध्यम से उपलब्ध थे)
Pure.Krome

1
@ Pure.Krome: जेफ के दूसरे प्रयास के साथ संयुक्त, अनलॉक, ज्यादातर मामलों में मेरे लिए काम करता है ... छवि सामग्री के अलावा (बिल्कुल!) को छोड़कर। : - \ <सेक्शनग्रुप नाम = "system.webServer"> <सेक्शन का नाम = "httpProtocol" ओवरराइडमोडडेफ़ॉल्ट = "अनुमति दें" /> </ सेक्शनग्रुप> [...] <httpProtocol> <customHeaders> <clear /> <add name = "ETag" मान = "" /> </ customHeaders> </ httpProtocol> तो कम से कम यहां एक आंशिक समाधान प्रतीत होता है।
jerhewet

@ जेर आपको एक उचित उत्तर के रूप में जोड़ना चाहिए
जेफ एटवुड

1
@jerhewet मेरे लिए काम नहीं करता (Windows Server 2008 R2, IIS 7.5)
sinelaw

1
जहां अन्य सभी समाधान विफल रहे या मेरे लिए लागू करने के लिए संभव नहीं थे, एक सरल पुनर्लेखन नियम ने काम किया। मेरा जवाब देखें: stackoverflow.com/a/18025228/705198
एंड्रयूपीके

22

मैंने इसे संभालने के लिए एक कस्टम http मॉड्यूल लिखा। यह वास्तव में उतना बुरा नहीं है जितना लगता है। यहाँ कोड है:

using System;
using System.Web;

namespace StrongNamespace.HttpModules
{
    public class CustomHeaderModule : IHttpModule
    {
        public void Init(HttpApplication application)
        {
            application.PostReleaseRequestState += new EventHandler(application_PostReleaseRequestState);

        }

        public void Dispose()
        {
        }

        void application_PostReleaseRequestState(object sender, EventArgs e)
        {
            HttpContext.Current.Response.Headers.Remove("Server");
            HttpContext.Current.Response.Headers.Remove("X-AspNet-Version");
            HttpContext.Current.Response.Headers.Remove("ETag");
        }
    }
}

यहां वेब.कॉन्फ़िग परिवर्तन आप चाहते हैं:

<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <remove name="X-Powered-By"/>
            </customHeaders>
        </httpProtocol>
        <modules>
            <add name="CustomHeaderModule" type="StrongNamespace.HttpModules.CustomHeaderModule"/>
        </modules>
    </system.webServer>
</configuration>

1
+1, हालाँकि यह केवल वेबसाइट से पूछे गए संसाधनों को कवर करने के लिए प्रतीत होता है, न कि फेविकन्स जैसी चीजें
ब्रैड

13

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं इसका हल खोजते हुए आया। मुझे लगता है कि मुझे एक उचित उत्तर मिला, जिसे मैंने इस प्रश्न के लिए पोस्ट किया था


जब तक आप इसे बदलने के बाद अपना कैश साफ़ नहीं करते तब तक काम करने की पुष्टि की जाती है;)
15

7

हमें यह समस्या थी, और यहां तक ​​कि IIS 7 में एक खाली कस्टम ETag हेडर सेट करना सभी फ़ाइलों (उदाहरण के लिए छवि फ़ाइलों) के लिए काम नहीं कर रहा था। हमने एक HttpModule का निर्माण किया, जो स्पष्ट रूप से ETag हेडर को हटाता है।


6

अद्यतन: उपयोगकर्ता @ChrisBarr के लिए URL रिवाइज़ मॉड्यूल आवश्यकता को जोड़ा गया

Iis 6 में यह आसान है, आप 'ETag' = "" के लिए एक कस्टम हेडर जोड़ सकते हैं

IIS 7 में, इस थ्रेड को पढ़ने और यह पता लगाने के बाद कि यह कस्टम http मॉड्यूल का उपयोग किए बिना असंभव था, मैंने पाया कि आप बस Microsoft के URL रिवाइटर मॉड्यूल को स्थापित कर सकते हैं और एक आउटबाउंड रीराइट नियम को जोड़ सकते हैं:

<outboundRules>
  <rule name="Remove ETag">
    <match serverVariable="RESPONSE_ETag" pattern=".+" />
    <action type="Rewrite" value="" />
  </rule>
</outboundRules>

यह वास्तव में काम करता है, और आपको एक कस्टम http मॉड्यूल (dll) की आवश्यकता नहीं है। System.webServer कॉन्फ़िगरेशन अनुभाग को अनलॉक करना और कस्टमहेडर्स इत्यादि को सेट करना, काम नहीं करता है - कम से कम सभी मामलों में मैंने कोशिश की। एक साधारण आउटबाउंड पुनर्लेखन नियम करता है।


1
इस समाधान के लिए इस कस्टम मॉड्यूल को IIS में स्थापित किया जाना आवश्यक है, सही है?
CBarr जूल

@ChrisBarr हाँ यह करता है - खेद है कि मैं यह उल्लेख करने में विफल रहा। उत्तर अपडेट किया गया।
एंड्रयूपीके

4

वैसे, जब आप iis8 का उपयोग करते हैं तो यह सरल है

<element name="clientCache">
   <attribute name="cacheControlMode" type="enum" defaultValue="NoControl">
          <enum name="NoControl" value="0" />
          <enum name="DisableCache" value="1" />
          <enum name="UseMaxAge" value="2" />
          <enum name="UseExpires" value="3" />
  </attribute>
  <attribute name="cacheControlMaxAge" type="timeSpan" defaultValue="1.00:00:00" />
  <attribute name="httpExpires" type="string" />
  <attribute name="cacheControlCustom" type="string" />
  <attribute name="setEtag" type="bool" defaultValue="true" />
</element>

IIS 8.0: ETag का उपयोग करने या न करने के लिए


2

http://www.jesscoburn.com/archives/2008/10/02/quickly-configure-or-disable-etags-in-iis7-or-iis6/ में एक अच्छा सचित्र मार्गदर्शिका है।

अनिवार्य रूप से, आप ETag नाम का एक कस्टम रिस्पॉन्स हेडर बनाते हैं और उसका मूल्य खाली करते हैं।


IIS6 पर, यह केवल मेरे लिए काम करता है जब मैंने कोई मूल्य निर्धारित नहीं किया सिर्फ दो दोहरे उद्धरण। यानी <httpProtocol> <customHeaders> <add name = "ETag" value = "" /> </ customHeaders> </ httpProtocol>
डंकन

2

इस ब्लॉग पोस्ट की जाँच करें कि कैसे iis6, iis7 और iis7.5 में Etag http हेडर को पूरी तरह से हटा दें

http://lightspeednow.com/blog/2010/05/21/iis-tutorial-how-to-completely-remove-etags-entity-tags-from-iis6-iis7-and-iis7-5/


2
हेलीकोन एप नामक थ्री पार्टी प्लग की आवश्यकता होती है। वास्तव में हमें एक समाधान की आवश्यकता है जो मूल IIS कॉन्फिगरेशन का उपयोग करता है, न कि एक अतिरिक्त प्लग इन। यह किसी भी बड़े पैमाने पर वेब फ़ार्म के लिए विशेष रूप से सच है, जो वास्तव में जहां ETag सबसे बड़ी समस्या है।
कीथ


1

IIS 7 में आपको etags के बारे में चिंता नहीं करनी चाहिए क्योंकि IIS कॉन्फ़िगरेशन संख्या हमेशा 0 पर सेट है।

यदि आपके पास उसी खेत में IIS6 & IIS7 webservers है, तो भी समस्या है। इस स्थिति में आपको इस आलेख में वर्णित के रूप में IIS6 कॉन्फ़िगर संख्या को मैन्युअल रूप से 0 पर सेट करना होगा ।

Etags वास्तव में बहुत उपयोगी होते हैं क्योंकि आपको फ़ाइल नाम बदलने की आवश्यकता नहीं होती है जैसे स्टैक ओवरफ्लो करता है (यानी default.cs? 1234)। यदि आप default.css फ़ाइल को बदलते हैं तो यह etag को बदल देगा और इसलिए बाद के अनुरोधों को सर्वर से फ़ाइल मिलेगी और कैश नहीं।


7
दूरगामी समाप्ति की तारीखें ईटैग को अप्रासंगिक बना देती हैं, क्योंकि ब्राउज़र शाब्दिक रूप से निर्दिष्ट तिथि तक फ़ाइल को फिर से कभी अनुरोध नहीं करेगा (या फ़ाइल नाम बदलने तक, निश्चित रूप से।) इस प्रकार, इसे हटाने की आवश्यकता - यह उस परिदृश्य में अप्रचलित है।
जेफ एटवुड

3
@JeffAtwood कड़ाई से सच नहीं है, अगर उपयोगकर्ता रिफ्रेश बटन दबाता है, तो ब्राउज़र फ़ाइल का अनुरोध करेगा, अगर etag वही है जो आपको मिलता है यदि आप एक 200 प्राप्त करते हैं, तो एक 304 मिलता है, यहाँ मुद्दा यह है कि आप नीचे 2 हेडर भेजते हैं जहाँ 1 पर्याप्त हो गया है
सैम सैफ्रन

1

मुझे लगता है कि यह काम करेगा .. मुझे पता है कि हटाने और खाली काम नहीं करता है।

    <configuration>
     <system.webServer>
       <httpProtocol>
          <customHeaders>
            <add name="ETag" value=" " /> 
          </customHeaders>
        </httpProtocol>
       </configuration>
     </system.webServer>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.