캐시 제어를 위해 HTTP 헤더를 설정하는 방법은 무엇입니까?


237

내 사이트에 브라우저 캐싱을 활성화하는 방법은 무엇입니까? 캐시 헤더를 다음과 같이 어딘가에 넣습니까?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
Cache-Control:public;
>

최신 버전의 XAMPP에서 개발중인 최신 버전의 PHP를 사용하고 있습니다.


어떤 서버 측 언어를 사용하고 있습니까? PHP ?, ASP ?, JSP? 헤더를 설정하는 방식은 비슷하지만 동일하지는 않습니다. 또는 이미지를 캐싱하는 경우 ... 종종 Apache (또는 웹 서버) 구성에서 수행됩니다.
scunliffe

슬프게도 "솔루션"은 단순히 잘못된 DOCTYPE를 생성 ;-) 당신이 (내가 그것을 권하고 싶지 않다) HTML에서 수행하고자하는 경우, 당신이 사용하는 거라고 META HTTP-EQUIV

답변:


198

HTML에 캐시 컨트롤을 사용하려면, 당신이 사용하는 메타 태그를 , 예를 들어,

<meta http-equiv="Cache-control" content="public">

컨텐츠 필드의 값은 아래 4 가지 값 중 하나로 정의됩니다.

Cache-Control헤더 에 대한 일부 정보 는 다음과 같습니다.

HTTP 1.1. 허용되는 값 = PUBLIC | 개인 정보 | NO-CACHE | 상점 없음.

공개-공개 공유 캐시에 캐시 될 수 있습니다.
개인-개인 캐시에만 캐시 할 수 있습니다.
캐시 없음-캐시되지 않을 수 있습니다.
No-Store-캐시 될 수 있지만 아카이브되지는 않습니다.

지시문 CACHE-CONTROL : NO-CACHE는 캐시 된 정보를 사용하지 말고 대신 요청을 원본 서버로 전달해야 함을 나타냅니다. 이 지시문은 PRAGMA : NO-CACHE와 동일한 의미를 갖습니다.

캐시없는 요청이 HTTP / 1.1 호환이 아닌 서버로 전송 될 때 클라이언트 PRAGMA : NO-CACHE 및 CACHE-CONTROL : NO-CACHE를 모두 포함해야합니다. EXPIRES도 참조하십시오.

참고 : 브라우저보다 많은 영향을 줄 수 있지만 정보를 캐시 할 수있는 프록시 및 기타 중개자에서는 META 문보다 HTTP에서 캐시 명령을 지정하는 것이 좋습니다.


30
HTML5이 금지 하고 <meta>항상 캐싱을 지정하는 끔찍한와 색다른 방법이었다.
Kornel

1
@porneL 귀하의 링크 중 어느 부분이 답변의 어느 부분을 금지하는지 이해하는 데 어려움이 있습니다 ... 메타 태그 사양은 여기에 작성된 내용을 싫어하거나 금지하는 것에 대해 아무 말도하지 않습니까?
Félix Gagnon-Grenier

1
@ FélixGagnon-Grenier "http-equiv 특성은 열거 된 특성입니다"는 스펙의 테이블에있는 값만 허용 함을 의미합니다. 이후 섹션에서 캐싱을 호출하기도합니다 ( "기타 pragma 지시문").> HTTP 처리 모델에 영향을 미치는 헤더 (예 : 캐싱)에 해당하는 Pragma 지시문은 등록하지 않아야합니다. 그렇지 않은 사용자 에이전트보다 HTML을 구현하는 사용자 에이전트.
Kornel

3
인용 된 문서는에 대한 정확하지 않은 no-store(문서 자체 참조에도 불구하고 값 RFC 2068 -) no-store문서가 저장되는 방지 / 어디서나, 모두에서 캐시. 반면 no-cache이를 보존 할 수 있도록 않지만, 서버와 모든 시간을 확인해야합니다. 브라우저는 뒤로 버튼 기능no-cache활성화 하기 위해 페이지 를 저장하는 경향이 있습니다 .
MrWhite

3
Google은 HTTP 캐싱 IMO에 대한 가장 쉬운 참조 중 하나 인 developers.google.com/web/fundamentals/performance/…
MrWhite

137

다음 을 사용하여 PHP에서 헤더를 설정할 수 있습니다 .

<?php
  //set headers to NOT cache a page
  header("Cache-Control: no-cache, must-revalidate"); //HTTP 1.1
  header("Pragma: no-cache"); //HTTP 1.0
  header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

  //or, if you DO want a file to cache, use:
  header("Cache-Control: max-age=2592000"); //30days (60sec * 60min * 24hours * 30days)

?>

사용되는 정확한 헤더는 요구 사항에 따라 다릅니다 (및 HTTP 1.0 및 / 또는 HTTP 1.1 을 지원해야하는 경우 ).


3
Pragma그리고 Expires아마도 브라우저의 대다수 중복된다. fastly.com/blog/headers-we-dont-want
thijsai

1
@thijsai 예 HTTP / 1.0도 상당히 오래되었습니다 ... 사용자 매트릭스를 기반으로 필요한 헤더 만 사용하십시오
scunliffe

49

내가 쓴 것처럼 파일을 사용하는 것이 가장 좋습니다 .htaccess. 그러나 캐시에 내용을 남길 시간에주의하십시오.

사용하다:

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>

위치 : 604800 = 7 일

PS : 헤더를 재설정하는 데 사용할 수 있습니다


30

http://www.askapache.com/htaccess/apache-speed-cache-control.html 의 페이지는 다음과 같은 사용을 제안합니다.

캐시 제어 헤더 추가

이것은 루트 .htaccess 파일에 있지만 httpd.conf에 액세스 할 수 있으면 좋습니다.

이 코드는 FilesMatch 지시문과 Header 지시문을 사용하여 특정 파일에 캐시 제어 헤더를 추가합니다.

# 480 weeks
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=290304000, public"
</FilesMatch>

3
이것의 순서가 중요합니까? "max-age = 290304000, 공개"또는 "public, max-age = 290304000"또는 둘 다 동일합니까?
Satya Prakash

2
값이 (같은 충돌하지 않을 경우 주문은 중요하지 않습니다 cacheno-cache). max-age그리고 public순서는 중요하지 않습니다, 그래서하지 충돌을한다.
Blaise

1
그것은 사용하기 때문에 참고 Header지시어를 활성화해야합니다 mod_headers.
Skippy le Grand Gourou

@Skippy le Grand Gourou mod_headers를 어떻게 활성화합니까?
Sam

@SamuelStratford 다른 배포판과 다른 점을 읽었지만 데비안에서는 a2enmod에서 /etc/apache2/mods-available/headers.load로 심볼릭 링크를 사용 하거나 만들 수 있습니다 /etc/apache2/mods-enabled/headers.load.
Skippy le Grand Gourou

21

이것은 .htaccess내 실제 웹 사이트에서 사용한 최고입니다 .

<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

##Tweaks##
Header set X-Frame-Options SAMEORIGIN

## EXPIRES CACHING ##
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 1 month"
</IfModule>
## EXPIRES CACHING ##

<IfModule mod_headers.c>
    Header set Connection keep-alive
    <filesmatch "\.(ico|flv|gif|swf|eot|woff|otf|ttf|svg)$">
        Header set Cache-Control "max-age=2592000, public"
    </filesmatch>
    <filesmatch "\.(jpg|jpeg|png)$">
        Header set Cache-Control "max-age=1209600, public"
    </filesmatch>
    # css and js should use private for proxy caching https://developers.google.com/speed/docs/best-practices/caching#LeverageProxyCaching
    <filesmatch "\.(css)$">
        Header set Cache-Control "max-age=31536000, private"
    </filesmatch>
    <filesmatch "\.(js)$">
        Header set Cache-Control "max-age=1209600, private"
    </filesmatch>
    <filesMatch "\.(x?html?|php)$">
        Header set Cache-Control "max-age=600, private, must-revalidate"
      </filesMatch>
</IfModule>

3
.htaccess 파일의 거의 완벽한 예 ... 특정 이미지가 포함되어 있고 이미지 경로를 작성하는 방법과 .htaccess 파일을 넣을 위치 (예 : image dir 또는 index dir)? .. 예 : '<IfModule mod_headers.c> <파일 /img/myimage.jpg> 헤더 추가 캐시 제어 "max-age = 3600, must-revalidate"</ Files> </ IfModule>'...이 작동합니까? .. OR ... 또는 img dir에 붙여 넣기 '<filesmatch "^ (example \ .jpg | sample \ .png) $"> 헤더 세트 Cache-Control "max-age = 31536000, public"</ filesmatch>'.. 같은 전략 이 모두 위험 해 보인다 – 만약에 어떤 경우에는 구체적인 예가 좋을 것이다
Marco-UandL

2
참고로 JS 및 CSS 파일의 gzip 압축은 SSL 암호화를 해제하는 데 도움이 될 수 있습니다. 보안에 의존하는 경우 gzip을 켜지 마십시오.
Eduard Void

1
로그인 계정 페이지를 캐싱하므로 계정에서 로그 아웃 할 수 없습니다. 더 나쁜 사람은 계정 페이지에 액세스 할 수없고 마지막 사용자 로그인으로 로그인 할 수 없습니다. 전자 상거래 사이트에서는 사용하지 않는 것이 좋습니다. 그런 다음 <filesMatch "\.(x?html?|php)$">정적 HTML 페이지가 캐시되지 않도록하려면를 제거해야합니다 . 나머지 파일 일치는 정상입니다.
nicoX

1
을 (를) 복제했습니다 <filesmatch "\.(eot|woff|otf|ttf|svg)$">.
nicoX

2
당신은 설정 cssjs비공개로 당신은 프록시 캐싱이있는 경우. 귀하의 링크에서 관련 권장 사항을 찾을 수 없습니다. 대부분의 CDN은 이러한 값을 캐시 할 것을 권장합니다.
nicoX

14

Apache 서버의 경우 만료 및 캐시 제어 헤더 설정을 위해 mod_expires 를 확인해야합니다 .

또는 사용할 수 있습니다 Header 지시문을 하여 직접 Cache-Control을 추가 .

Header set Cache-Control "max-age=290304000, public"

5

메타 캐시 제어 태그를 사용하면 웹 게시자는 캐시에서 페이지를 처리하는 방법을 정의 할 수 있습니다. 캐시 가능한 것, 캐시에 의해 저장 될 수있는 것, 만료 메커니즘의 수정, 재확인 및 재로드 제어를 선언하는 지시문이 포함됩니다.

허용되는 값은 다음과 같습니다.

공개-공개 공유 캐시에 캐시
될 수 있습니다. 개인-비공개 캐시에만 캐시 될 수 있습니다. 캐시
없음-캐시되지 않을
수 있습니다.

대소 문자 구분에주의하십시오. 웹 페이지 소스에 다음 메타 태그를 추가하십시오. 태그 끝의 철자 차이는 "/> = xml 또는"> = html을 사용한다는 것입니다.

    <meta http-equiv="Cache-control" content="public">
    <meta http-equiv="Cache-control" content="private">
    <meta http-equiv="Cache-control" content="no-cache">
    <meta http-equiv="Cache-control" content="no-store">

소스-> 메타 태그


수정 : 어떤 매장이 캐시되지해서는 안된다, 아니 캐시는 캐시되도록 허용되지 않고, 예약 전에 서버와 함께 점검해야합니다 - 볼 palizine.plynt.com/issues/2008Jul/cache-control-attributes
DangerMouse을

Cache-Control no-store-no-store는 응답을 캐시하고 재사용 할 수 없다는 점에서 no-cache와 유사하지만 한 가지 중요한 차이점이 있습니다. no-store는 매번 원본 서버에서 리소스를 요청하고 다운로드해야합니다. 이것은 개인 정보를 다룰 때 중요한 기능입니다.
MarcoZen

5

OWASP는 다음을 권장합니다.

가능할 때마다 캐시 제어 HTTP 헤더가 캐시 없음, 저장소 없음, 재확인, 개인용으로 설정되어 있는지 확인하십시오. pragma HTTP 헤더는 no-cache로 설정되어 있습니다.

<IfModule mod_headers.c>
    Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
    Header set Pragma "no-cache"
</IfModule>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.