Empêcher IIS 7.5 d’envoyer l’âge maximal du contrôle de cache sur les codes d’erreur


10

J'ai du contenu statique avec des en- Max-Agetêtes de contrôle de cache attachés afin que les clients mettent en cache le contenu statique. Cependant, IIS 7.5 envoie toujours cet en-tête lorsqu'il existe des réponses d'erreur conseillant au client de mettre cela en cache.

Cela a pour effet négatif que certains mandataires mettent en cache cette réponse d'erreur. Je pourrais Vary: Accept,Accept-Encodingmais cela ne résout pas vraiment le problème fondamental de Max-Agesortir des réponses d'erreur.

La web.configsection IIS actuellement pertinente est:

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

Existe-t-il un moyen de faire en sorte que nous ne disions pas aux clients ou aux mandataires de mettre en cache les codes d'erreur 400/500?


Utilisez-vous des pages d'erreur personnalisées?
Justin Niessner

@Justin - Non, pas dans ce cas
Nick Craver

IIS 7.0 n'envoie pas Max-Age sur 40 * pour moi. Je ne sais pas si c'est une différence entre les versions d'IIS.
David Murdoch

De plus, comment forcer un contenu statique à envoyer un code d'erreur 500?
David Murdoch

1
@DavidMurdoch par exemple, nous voyons 406 réponses envoyées avec des en-têtes de contrôle de cache lorsque les utilisateurs demandent javascript, mais le client accepte uniquement les types MIME d'images. Les mandataires respectent cette directive de mise en cache (comme ils le devraient, selon la spécification) et les autres utilisateurs ne peuvent pas télécharger le script.
Jarrod Dixon

Réponses:


2

J'ai créé une "suite" de tests rudimentaires.

Lorsque j'exécute les tests avec un Web.config minimal sur IIS 7.0 (mode de ligne intégrée sur .NET 4.0), tout se passe; l'en- Cache-Controltête de réponse du fichier de test est défini sur privatelorsque l'en- Accepttête de sa demande ne correspond pas à celui du fichier Content-Type.

Cela m'amène à croire que vous avez un module qui interrompt la routine de mise en cache statique d'IIS ou IIS 7.0 et 7.5 diffèrent ici.

Voici les fichiers que j'ai utilisés (sans some-script.jspuisque c'est juste un fichier vide):

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>

Nous pouvons reproduire vos résultats en utilisant les demandes adressées à localhost - avez-vous essayé de faire les mêmes tests à partir d'une machine distante?
Geoff Dalgas

Oui je l'ai fait. se.vervestudios.co/tests/se-test/test.html (note aux personnes du futur, le lien précédent était uniquement à des fins de test temporaire et ne fonctionne probablement plus, désolé)
David Murdoch

L'erreur incorporée dans cette réponse expose des informations quelque peu risquées - voir ici . Il semble que votre serveur pense que toutes les demandes ont été émises localement - voir: iis.net/ConfigReference/system.webServer/httpErrors Si vous activez CustomErrors via: <httpErrors errorMode = "Custom" /> vous verrez le même problème que nous rencontrons @ David
Geoff Dalgas

0

vous devez spécifier le type de contenu que vous allez mettre en cache. par exemple, vous pouvez mettre en cache les scripts, css, image ..etc. utilisez donc la <location path ="Scripts">balise avant la <system.webServer>balise. de sorte que votre configuration Web ressemble à ceci.

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

Est-ce que cela répond vraiment à cette question?
poussins
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.