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 오류 코드를 캐시하지 않도록 지시 할 수있는 방법이 있습니까?
답변
초보 테스트 “스위트”를 만들었습니다.
IIS 7.0 (.NET 4.0의 통합 된 pipline 모드)에서 최소 Web.config로 테스트를 실행하면 모든 것이 통과됩니다. 테스트 파일의 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>