IIS 7.5에서 오류 코드에 대한 캐시 제어 최대 에이지 전송 중지


10

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 오류 코드를 캐시하지 않도록 지시 할 수있는 방법이 있습니까?


사용자 정의 오류 페이지를 사용하고 있습니까?
저스틴 니스 너

@Justin-아니요,이 경우에는 아닙니다
Nick Craver

IIS 7.0은 Max-Age를 40 *로 보내지 않습니다. 그래도 IIS 버전간에 차이가 있는지 확실하지 않습니다.
David Murdoch

또한 정적 콘텐츠가 500 오류 코드를 보내도록하려면 어떻게해야합니까?
David Murdoch

1
예를 들어 @DavidMurdoch는 사용자가 자바 스크립트를 요청할 때 캐시 제어 헤더와 함께 406 응답을 보냈지 만 클라이언트는 이미지 MIME 유형 만 허용합니다. 프록시는이 캐싱 지시문 (사양에 따라)을 준수하고 있으며 다른 사용자는 스크립트를 다운로드 할 수 없습니다.
Jarrod Dixon

답변:


2

초보 테스트 "스위트"를 만들었습니다.

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>

localhost에 대한 요청을 사용하여 찾은 결과를 재현 할 수 있습니다. 원격 시스템에서 동일한 테스트를 시도 했습니까?
Geoff Dalgas

그래, 내가 했어. se.vervestudios.co/tests/se-test/test.html (미래의 사람들에게 참고 이전 링크는 죄송합니다, 더 이상 작동하지 않는 경우에만 아마 일시적으로 테스트 목적으로했다)
데이비드 머독

이 응답에 포함 된 오류는 다소 위험한 정보를 노출시킵니다 ( 여기 참조) . 서버가 모든 요청이 로컬로 발행되었다고 생각하는 것 같습니다. iis.net/ConfigReference/system.webServer/httpErrors <httpErrors errorMode = "Custom"/>을 통해 CustomErrors를 활성화하면 @ David
Geoff Dalgas

0

캐시 할 컨텐츠 유형을 지정해야합니다. 예를 들어 스크립트, 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>

이것이 실제로이 질문을 해결합니까?
병아리
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.