IIS7 캐시 제어


95

나는 꽤 간단하다고 생각했던 것을 시도하고있다. IIS 7을 사용하여 클라이언트에게 특정 시간 (예 : 24 시간) 동안 내 사이트의 모든 이미지를 캐시 할 수 있음을 알립니다.

http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx 에서 단계를 시도 했지만 아무 소용이 없습니다. 나는 여전히 304s가 반환되는 서버로가는 요청을받습니다.

누구든지 이것을 할 방법이 있습니까? 나는 그래픽 집약적 인 사이트를 가지고 있으며 사용자가 페이지를 요청할 때마다 내 서버도 망치고 있습니다. 이상하게도 이미지에 "Cache-Control private, max-age = 3600"이 Firebug에 표시되는 것처럼 보이지만 F5를 누르면 브라우저가 여전히 이미지를 요청합니다.

답변:


124

Cache-Control 헤더를 설정하려는 경우 슬프게도 IIS7 UI에는이를 수행 할 수있는 것이 없습니다.

그러나이 web.config를 설정하려는 폴더 또는 사이트의 루트에 놓을 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

그러면 해당 폴더와 모든 하위 폴더에서 7 일 동안 콘텐츠를 캐시하도록 클라이언트에 알립니다.

다음과 같이을 통해 IIS7 메타베이스를 편집하여이 작업을 수행 할 수도 있습니다 appcmd.exe.

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  "기본 웹 사이트 / 폴더"구성 설정 
  -section : system.webServer / staticContent 
  -clientCache.cacheControlMode : UseMaxAge

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  "기본 웹 사이트 / 폴더"구성 설정 
  -section : system.webServer / staticContent 
  -clientCache.cacheControlMaxAge : "7.00 : 00 : 00"

5
staticContent 구성 요소에 대한 MSDN 설명서는 다음에서 찾을 수 있습니다. msdn.microsoft.com/en-us/library/ms689443.aspx
Milan Gardian

4
UI는 IIS7이 거기에있다, 360Airwalk 게시물 아래 참조
ChadT

정보처럼 :이 설정은 기본 제공 개발 서버 (적어도 VS 2010 SP1의)에 영향을 미치지 않는 것 같습니다. 작동하지 않는 이유가 확실하지 않은 경우 IIS를 확인하십시오.

6
안녕하세요 Jeff, 다양한 MIME 유형 또는 파일 확장자에 대해 서로 다른 Cache-Control( max-age) 헤더 를 제공하는 방법을 알고 있습니까?
Jasper

@Jeff Atwood 어쩌면 당신이 나를 도울 수 있습니다. 이것 좀 봐 : stackoverflow.com/questions/57990579/…
Success Man

116

사실 Jeff가 아닙니다.

IIS 7 관리자 UI 내에서 폴더 (예 : 이미지 또는 이벤트 기본 웹 응용 프로그램 폴더)를 선택한 다음 "HTTP 응답 헤더"를 클릭하기 만하면됩니다. 그런 다음 오른쪽 창에서 "Set Common Header .."를 클릭하고 "Expire Web content"를 선택해야합니다. "이후 :"를 선택하고 텍스트 상자에 "24"를 입력하고 콤보 상자에서 "시간"을 선택하여 24 시간의 최대 연령을 쉽게 구성 할 수 있습니다.

web.config 항목에 관한 첫 번째 단락이 맞습니다. cacheControlCustom-attribute를 추가하여 캐시 제어 헤더를 "public"으로 설정하거나이 경우에 필요한 모든 것을 설정합니다.

물론 필요에 따라 web.config 항목 (또는 파일)을 제공하여 동일한 작업을 수행 할 수 있습니다.

편집 : 혼란스러운 문장 제거 :)


1
이 설정의 UI는 끔찍합니다. 하지만 거기에가는 방법을 설명 해주셔서 감사합니다! +1
Billy Coover

이 인터페이스는 Jeff가 게시 한 것과 동일한 구성으로 web.config를 만듭니다. 알아서 반가워요! 감사!
RandyMorris 2011

2
@ 360Airwalk 게시물에 감사드립니다. 다른 MIME 유형이나 파일 확장자에 대해 다른 Cache-Control( max-age) 헤더 를 제공하는 방법을 알고 있습니까?
Jasper

3
@Jasper : 예를 들어 폴더별로 설정할 수 있습니다. 폴더 하위 폴더에 캐시 제어를 설정하면 설정이 상속되지만 다시 재정의 할 수 있습니다. 파일 단위로도 할 수 있습니다. iis 콘솔에 액세스 할 수없는 경우 web.config를 통해 수행 할 수도 있습니다. 후자의 경우이 게시물을 참조하십시오. stackoverflow.com/questions/2195266/…
360Airwalk

27

나는 이것을 사용한다

<staticContent>
<clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="500.00:00:00" />
</staticContent>

공개 캐시 제어 헤더로 500 일 동안 정적 콘텐츠를 캐시합니다.


10
권장되는 방법은 기본적으로 365 일이 아닌 1 년입니다.
Anicho 2012-06-20

5
500 일은 BAD입니다.이 기사에서는 캐시를 1 년 이상으로 설정하지 말라고하는 RFC 규칙에 대해 설명합니다. developers.google.com/speed/docs/best-practices/caching 향후 1 년 이상으로 설정하지 마십시오. , 이는 RFC 지침을 위반하기 때문입니다.
foxontherock 2013-06-26

@foxontherock 365 일 이상의 RFC 규칙이 나쁜 습관임을 입증 할 수있는 방법이 있습니까? 문서에서 이것을 제안하는 것을 찾을 수 없습니다 ...
Paesano2000

@Elmer 어쩌면 당신이 나를 도울 수 있습니다. 이것 좀 봐 : stackoverflow.com/questions/57990579/…
Success Man

19

F5 새로 고침은 "현재 HTML 그 직접 종속성을 다시로드하십시오"라는 의미를 갖습니다 . 따라서 HTML에서 직접 참조하는 imgs, css 및 js 리소스도 다시 가져 오는 것을 볼 수 있습니다. 물론 304는 이에 대한 허용 가능한 응답이지만 F5 새로 고침은 브라우저가 새로운 캐시 콘텐츠에 의존하지 않고 요청을 할 것임을 의미합니다.

대신 다른 곳으로 이동 한 다음 다시 탐색 해보십시오.

대부분의 브라우저에서 Ctrl 키를 누른 채 f5 키를 누르면 304를 지나서 강제로 새로 고침 할 수 있습니다.


18

내 편집이 롤백되면서 Elmer의 답변을 보완합니다.

public cache-control header를 사용 하여 365 일 동안 정적 콘텐츠를 캐시하려면 IIS를 다음과 같이 구성 할 수 있습니다.

<staticContent>
    <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
</staticContent>

이것은 다음과 같은 헤더로 변환됩니다.

Cache-Control: public,max-age=31536000

max-age는 RFC 2616 섹션 14.9.3 및 14.9.4에 명시된대로 양의 32 비트 정수로 표현되는 델타 (초) 입니다. 이는 최대 값 2 ^ 31 또는 2,147,483,648 초 (68 년 이상)를 나타냅니다. 그러나 클라이언트와 서버 간의 호환성을 향상시키기 위해 권장되는 최대 365 일 (1 년)을 채택합니다.

다른 답변에서 언급했듯이 모든 정적 콘텐츠에 대해 사이트의 web.config에서도 이러한 지시문을 사용할 수 있습니다. 또는 특정 위치의 콘텐츠 에만 사용할 수도 있습니다 (샘플에서는 "cdn"폴더의 콘텐츠에 대해 30 일 공용 캐시).

<location path="cdn">
   <system.webServer>
        <staticContent>
             <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00"/>
        </staticContent>
   </system.webServer>
</location>

Luciano, 나는 당신의 방법을 사용하여 내 이미지를 캐시하려고합니다. 이제 HttpFox를 사용하여 분석 할 때 각 이미지에 대한 2 개의 요청이 표시됩니다. 1. 첫 번째는 (NS_BINDING_ABORTED) 오류와 함께 중단 된 결과를 제공합니다. 2. 두 번째 요청은 캐시 된 이미지입니다. 이견있는 사람?
Mithil

1

쉬운 방법이 있습니다 : 1. 웹 사이트의 web.config 사용 2. "staticContent"섹션에서 특정 fileExtension 제거 및 mimeMap 추가 3. "clientCache"추가

<configuration>
  <system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    <staticContent>
      <remove fileExtension=".ipa" />
      <remove fileExtension=".apk" />
      <mimeMap fileExtension=".ipa" mimeType="application/iphone" />
      <mimeMap fileExtension=".apk" mimeType="application/vnd.android.package-archive" />
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="777.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.