IIS 7.5 को त्रुटि कोड पर कैश-कंट्रोल मैक्स-आयु भेजने से रोकें


10

मेरे पास कैश कंट्रोल Max-Ageहेडर के साथ कुछ स्टैटिक कंटेंट हैं, जिससे क्लाइंट स्टैटिक कंटेंट को कैश करेंगे। हालाँकि, IIS 7.5 अभी भी इस शीर्ष लेख को भेजता है जब ग्राहक को इसे कैश करने के लिए सलाह देने में त्रुटि प्रतिक्रियाएं होती हैं।

नकारात्मक प्रभाव है कि कुछ परदे के पीछे कि त्रुटि प्रतिक्रिया कैश होगा। मैं कर सकता था, Vary: Accept,Accept-Encodingलेकिन यह वास्तव में Max-Ageत्रुटि प्रतिक्रियाओं पर बाहर जाने की जड़ समस्या का समाधान नहीं करता है ।

वर्तमान प्रासंगिक IIS web.configअनुभाग है:

<configuration>
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

क्या कोई ऐसा तरीका है जिससे मैं इसे बना सकता हूं ताकि हम क्लाइंट या प्रॉक्सी को 400/500 त्रुटि कोड कैश न करें?


क्या आप कस्टम त्रुटि पृष्ठों का उपयोग कर रहे हैं?
जस्टिन नीस्नर

@Justin - नहीं, इस मामले में नहीं
निक Craver

IIS 7.0 मेरे लिए 40 * पर मैक्स-एज नहीं भेजता है। मुझे यकीन नहीं है कि अगर यह IIS संस्करणों के बीच एक विसंगति है, हालांकि।
डेविड मर्डोक

साथ ही, 500 त्रुटि कोड भेजने के लिए एक स्थिर सामग्री कैसे मजबूर करती है?
डेविड मर्डोक

1
उदाहरण के लिए @DavidMurdoch, हम 406 कैश कंट्रोल हेडर के साथ भेजे गए प्रतिक्रियाओं को देख रहे हैं जब उपयोगकर्ता जावास्क्रिप्ट का अनुरोध करते हैं, लेकिन क्लाइंट केवल छवि MIME प्रकारों को स्वीकार करता है। प्रॉक्सी इस कैशिंग निर्देश का सम्मान कर रहे हैं (जैसा कि उन्हें चाहिए, युक्ति से) और अन्य उपयोगकर्ता स्क्रिप्ट डाउनलोड करने में असमर्थ हैं।
जारोड डिक्सन

जवाबों:


2

मैंने एक अल्पविकसित परीक्षण "सूट" बनाया।

जब मैं IIS 7.0 पर न्यूनतम Web.config के साथ परीक्षण चलाता हूं (.NET 4.0 पर एकीकृत पाइपलाइन मोड) सब कुछ गुजरता है; परीक्षण फ़ाइल का Cache-Controlप्रतिक्रिया शीर्षलेख privateतब सेट किया जाता है जब वह अनुरोध के Acceptशीर्षलेख फ़ाइल के मिलान से मेल नहीं खाता Content-Type

यह मुझे विश्वास दिलाता है कि आपके पास IIS के स्थिर कैचिंग रूटीन या IIS 7.0 और 7.5 के बीच में कुछ अंतर है।

यहां वे फाइलें हैं जिनका मैंने इस्तेमाल किया ( some-script.jsसिर्फ एक खाली फाइल के बाद से):

Web.Config:

<?xml version="1.0"?>
<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0">
        </compilation>
    </system.web>
    <system.webServer>
        <staticContent>
            <!-- Set expire headers to 30 days for static content-->
            <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
        </staticContent>
    </system.webServer>
</configuration>

test.html:

<!doctype html>
<html>
<head>
    <title>http://serverfault.com/questions/346975</title>
    <style>
        body > div
        {
            border:1px solid;
            padding:10px;
            margin:10px;
        }
    </style>
</head>
    <body>
        <div>
            <h2>Request JS file with Accepts: accept/nothing</h2>
            <b>Response Headers: </b>
            <pre id="responseHeaders-1">loading&hellip</pre>
        </div>

        <div>
            <h2>Request JS file with Accepts: */*</h2>
            <b>Response Headers: </b>
            <pre id="responseHeaders-2">loading&hellip</pre>
        </div>

        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
        <script>
            var responseHeaders1 = $("#responseHeaders-1"),
                responseHeaders2 = $("#responseHeaders-2"),
                fetchScript = function (accepts, element, successMsg, errorMsg) {

                    var jXhr = $.ajax({
                        // fetch the resource "fresh" each time since we are testing the Cache-Control header and not caching itself
                        "url": "some-script.js?" + (new Date).getTime(),
                        "headers": {
                            "Accept" : accepts
                        },
                        "complete": function () {
                            var headers = jXhr.getAllResponseHeaders();
                            headers = headers.replace(/(Cache-Control:.+)/i, "<strong><u>$1</u></strong>");
                            element.html(headers);
                        },
                        "success": function () {
                            element.after("<div>" + successMsg + "</div>");
                        },
                        "error": function () {
                            element.after("<div>" + errorMsg + "</div>");
                        }
                    });
                };

                fetchScript("accept/nothing", responseHeaders1, "Uh, your server is sending stuff when the client doesn't accept it.", "Your server (probably) responded correctly.");
                fetchScript("*/*", responseHeaders2, "Your server responded correctly.", "Something went wrong.");
        </script>
    </body>
</html>

हम लोकलहोस्ट के अनुरोधों का उपयोग करके आपके निष्कर्षों को पुन: पेश कर सकते हैं - क्या आपने रिमोट मशीन से समान परीक्षण करने की कोशिश की है?
ज्योफ Dalgas

हाँ, मैंने किया। se.vervestudios.co/tests/se-test/test.html (भविष्य के लोगों पर ध्यान दें, पिछला लिंक केवल अस्थायी परीक्षण उद्देश्यों के लिए था और शायद अब और काम नहीं करता, क्षमा करें)
डेविड मर्डोक

उस प्रतिक्रिया में एम्बेडेड त्रुटि कुछ जोखिम भरी जानकारी को उजागर करती है - यहां देखें । ऐसा लगता है कि आपके सर्वर का मानना ​​है कि सभी अनुरोध स्थानीय रूप से जारी किए गए थे - देखें: iis.net/ConfigReference/system.webServer/httpErrors यदि आप CustomErrors को सक्षम करते हैं: <httpErrorsors errorMode = "कस्टम" /> आपको वही समस्या दिखाई देगी जो हम @ @ कर रहे हैं। डेविड
ज्योफ Dalgas

0

आपको यह निर्दिष्ट करना चाहिए कि आप किस प्रकार की सामग्री को कैश करने जा रहे हैं। उदाहरण के लिए आप लिपियों, सीएसएस, छवि को कैश कर सकते हैं .. आदि। इसलिए <location path ="Scripts">टैग से पहले टैग का उपयोग करें <system.webServer>। इसलिए आपका वेब कॉन्फिग इस तरह दिखता है।

 <location path ="Scripts">
    <system.webServer>
      <staticContent>
        <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="07:00:00" />
      </staticContent>
    </system.webServer>
  </location>
  <location path ="css">
    <system.webServer>
      <staticContent>
        <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="07:00:00" />
      </staticContent>
    </system.webServer>
 </location>

क्या यह वास्तव में इस प्रश्न को संबोधित करता है?
चूजों
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.