IIS 7.5'in Hata Kodlarında Önbellek Denetimi Maksimum Yaş Göndermesini Durdurma


10

Max-AgeIstemciler statik içeriği önbelleğe böylece önbellek denetim üstbilgileri ile bazı statik içerik var . Ancak, istemcinin önbelleğe almasını bildiren hata yanıtları olduğunda IIS 7.5 yine de bu üstbilgiyi gönderir.

Bazı proxy'lerin bu hata yanıtını önbelleğe almasının olumsuz etkisi vardır. Yapabilirdim Vary: Accept,Accept-Encodingama bu gerçekten Max-Agehata yanıtlarına çıkmanın temel sorununu ele almıyor .

Geçerli ilgili IIS web.configbölümü:

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

400/500 hata kodlarını önbelleğe almamızı istemcilere veya proxy'lere söylememem için bir yol var mı?


Özel hata sayfaları mı kullanıyorsunuz?
Justin Niessner

@Justin - Hayır, bu durumda değil
Nick Craver

IIS 7.0 benim için 40 * 'a Max-Age göndermiyor. Ben onun IIS sürümleri arasında bir tutarsızlık olsa emin değilim.
David Murdoch

Ayrıca, biri statik içeriği 500 hata kodu göndermeye nasıl zorlar?
David Murdoch

1
@DavidMurdoch, örneğin kullanıcılar javascript istediğinde önbellek kontrol başlıklarıyla gönderilen 406 yanıtı görüyor, ancak istemci yalnızca resim MIME türlerini kabul ediyor. Proxy'ler bu önbelleğe alma yönergesine saygı duyarlar (şartname gereği gibi) ve diğer kullanıcılar komut dosyasını indiremez.
Jarrod Dixon

Yanıtlar:


2

İlkel bir test "suite" oluşturdum.

IIS 7.0 (.NET 4.0'da tümleşik pipline modu) üzerinde en az Web.config ile sınama çalıştırdığımda her şey geçer; sınama dosyasının Cache-Controlyanıt üstbilgisi, privateisteğinin Acceptüstbilgisi dosyanın eşleşmemesi durumunda olarak ayarlanır Content-Type.

Bu, IIS'nin statik önbellek yordamını kesintiye uğratan bazı modüllerin olduğuna veya IIS 7.0 ve 7.5'in burada farklı olduğuna inanmamı sağlıyor.

İşte kullandığım dosyalar ( some-script.jssadece boş bir dosyadan beri sans ):

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>

Bulgularınızı localhost isteklerini kullanarak yeniden üretebiliriz - aynı testleri uzaktaki bir makineden yapmayı denediniz mi?
Geoff Dalgas

Evet yaptım. se.vervestudios.co/tests/se-test/test.html (geleceğin insanlarına not, önceki bağlantı sadece geçici test amaçlıydı ve muhtemelen artık çalışmıyor, üzgünüm)
David Murdoch

Bu yanıta gömülü olan hata biraz riskli bilgiler ortaya çıkarır - buraya bakın . Sunucunuzun tüm isteklerin yerel olarak yayınlandığını düşündüğü anlaşılıyor - bkz: iis.net/ConfigReference/system.webServer/httpErrors CustomErrors'u şu şekilde etkinleştirirseniz: <httpErrors errorMode = "Custom" /> yaşadığımız aynı sorunu göreceksiniz David
Geoff Dalgas

0

ne tür içeriği önbelleğe alacağınızı belirtmelisiniz. örneğin Scripts, css, image ..etc'yi önbelleğe alabilirsiniz. <location path ="Scripts">etiketten önce <system.webServer>etiketi kullanın . web yapılandırmanız şöyle görünür.

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

Bu gerçekten bu soruyu ele alıyor mu?
civcivler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.