Зупиніть IIS 7.5 від надсилання максимальної епохи кеш-контролю на коди помилок


10

У мене є деякий статичний вміст із Max-Ageдоданими заголовками кеш-керування, щоб клієнти кешували статичний вміст. Однак IIS 7.5 все ж надсилає цей заголовок, коли є відповіді на помилки, які рекомендують клієнту кешувати це.

Це негативно впливає на те, що деякі проксі-сервери будуть кешувати цю помилку. Я міг би, Vary: Accept,Accept-Encodingале це насправді не вирішує корінну проблему Max-Ageвиходу з відповідей на помилки.

Поточний відповідний web.configрозділ IIS :

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

Чи є спосіб, щоб я міг зробити це, щоб ми не повідомили клієнтам або проксі-серверам кешувати 400/500 кодів помилок?


Використовуєте користувацькі сторінки помилок?
Джастін Ніссснер

@Justin - Ні, не в цьому випадку
Нік Крейвер

IIS 7.0 не надсилає для мене Max-Age на 40 *. Я не впевнений, чи є його невідповідність між версіями IIS.
Девід Мердок

Крім того, як змусити статичний вміст надсилати код помилки 500?
Девід Мердок

1
Наприклад, @DavidMurdoch ми бачимо 406 відповідей, надісланих кешами кеша, коли користувачі вимагають JavaScript, але клієнт приймає лише типи MIME зображень. Проксі-сервери дотримуються цієї кешування-директиви (як слід за специфікацією), а інші користувачі не можуть завантажити сценарій.
Jarrod Dixon

Відповіді:


2

Я створив рудиментарний тест "люкс".

Коли я запускаю тести з мінімальним Web.config на IIS 7.0 (інтегрований режим трубопроводу в .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>

Ми можемо відтворити ваші результати, використовуючи запити до localhost - чи намагалися ви робити ті ж тести з віддаленої машини?
Джефф Дальгас

Так. se.vervestudios.co/tests/se-test/test.html (зверніть увагу на людей майбутнього, попереднє посилання було лише для тимчасових цілей і, ймовірно, більше не працює, вибачте)
Девід Мердок

Помилка, вкладена у цій відповіді, викриває дещо ризиковану інформацію - дивіться тут . Виявляється , що ваш сервер вважає , що всі запити були випущені на місці - см: iis.net/ConfigReference/system.webServer/httpErrors Якщо включити CustomErrors через: <httpErrors ErrorMode = «Custom» /> ви побачите те ж питання , ми маємо @ Девід
Джефф Дальгас

0

слід вказати, який тип вмісту ви збираєтеся кешувати. наприклад, ви можете кешувати скрипти, css, image ..etc. тому використовуйте <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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.