У меня есть статический контент с контролем кеша 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?
Я создал элементарный тестовый «набор».
Когда я запускаю тесты с минимальным 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>
вы должны указать, какой тип контента вы собираетесь кэшировать. например, вы можете кэшировать скрипты, CSS, изображения и т. д. так что используйте <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>