문제

Apache의 정적 콘텐츠를 {브라우저에서 캐시}하고 {{모든 요청에 ​​대해} 최신성을 확인}하지 않도록 하려면 어떻게 해야 하나요?

저는 Apache 웹서버에서 호스팅되는 웹사이트에서 작업하고 있습니다.최근에 헤더(다양한 유형의 콘텐츠에 대한 Content-Type)를 사용하여 테스트를 하다가 이미지에 대한 조건부 요청을 많이 보았습니다.예:

200 /index.php?page=1234&action=list
304 /favicon.ico
304 /img/logo.png
304 /img/arrow.png
(etc.)

이미지 파일은 정적 콘텐츠이고 브라우저에 의해 캐시되지만 사용자가 해당 파일로 연결되는 페이지를 열 때마다 조건부로 요청되며 "304 Not Modified"가 전송됩니다.이는 좋지만(전송되는 데이터가 적음) 페이지 로드마다 요청이 20개 이상 추가된다는 의미입니다(Keep-Alive 및 파이프라이닝이 활성화된 경우에도 모든 왕복으로 인해 페이지 로드가 길어짐).

기존 파일을 유지하고 최신 버전을 확인하지 않도록 브라우저에 어떻게 지시합니까?

편집하다:mod_expires 메소드는 favicon에서도 작동합니다.

도움이 되었습니까?

해결책

만료 Apache의 모듈은 이 문제를 해결합니다.

a2enmod expires

서버 구성에 로드하고 다음에서 설정해야 합니다. .htaccess (또는 서버 구성에서).

만료 헤더의 경우 리소스는 처음으로만 요청됩니다.만료 날짜 이전에는 브라우저 캐시에서 후속 요청이 이행됩니다.지정된 시간이 만료되고 리소스가 필요한 경우에만 다시 요청됩니다(조건부 - 변경되지 않은 리소스에 대해 304가 반환됨).만료되기 전에 캐시에서 이를 지우는 신뢰할 수 있는 유일한 방법은 수동으로 또는 강제로 새로 고치는 것(보통 Ctrl-F5)입니다.(그 사이에 리소스가 변경되면 문제가 될 수 있지만 정적 이미지는 자주 변경되지 않습니다.)

# enable the directives - assuming they're not enabled globally
ExpiresActive on

# send an Expires: header for each of these mimetypes (as defined by server)
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"

# css may change a bit sometimes, so define shorter expiration
ExpiresByType text/css "access plus 1 days"

favicon.ico의 경우 조금 더 작업이 필요합니다(Apache는 일반적으로 Windows 아이콘 파일을 인식하지 못하며 이를 기본 텍스트/일반으로 보냅니다).

# special MIME type for icons - see http://www.iana.org/assignments/media-types/image/vnd.microsoft.icon
AddType image/vnd.microsoft.icon .ico
# now we have icon MIME type, we can use it
# my favicon doesn't change much
ExpiresByType image/vnd.microsoft.icon "access plus 3 months"

짜잔, It Works™!

다른 팁

이랑 filesMatch 대신 지침 ExpiresByType, 당신은 그룹화 할 수 있습니다 Content-Type 일치함으로써 subtype (예 : image/*), 각각을 나열하는 대신 type/subtype 쌍이 아닙니다 subtype (예 : image/jpeg, image/png).

#Set caching on image files for 11 months
<filesMatch "\.(ico|gif|jpg|png)$">
  ExpiresActive On
  ExpiresDefault "access plus 11 month"
  Header append Cache-Control "public"
</filesMatch>

acoording 이 Google 기사 나는 1 년 이하가 아니라 만료를했다 (access plus 11 month) 및 추가 Cache-Control "public" Firefox 용 HTTPS 캐싱을 활성화합니다.

CSS 및 JS의 경우 Google은 1 주일의 만료 기간을 권장합니다.

<filesMatch "\.(css|js)$">
  ExpiresActive On
  ExpiresDefault "access plus 1 week"
  Header append Cache-Control "public"
</filesMatch>

당신이 설정하면 Expires 정적 이미지에 대한 HTTP 응답에 대한 헤더, 지정된 시간이 통과 될 때까지 처음 다운로드 한 후 서버가 다시 확인되지 않습니다. 예를 들어 서버에서 파일을 다운로드하면 지금 제공합니다. Expires 헤더로

Expires: Fri, 1 Jan 2010 00:00:01 GMT 

캐시/포스 새로 고침 (Windows의 Ctrl+F5)을 지우지 않는 한 내 브라우저는 서버에서 2010 년까지 다시 찾을 수 없습니다.

이것을 설정하기위한 간단한 소개가 있습니다 여기, 및 기타 유용한 응답 목록 위키 백과

favicon.ico와 관련하여 서버 문서에 넣으십시오. 루트/var/www/html say/httpd/conf/httpd.conf에 이것을 aliases 섹션에 추가하십시오.

Alias /favicon.ico "/var/www/html/favicon.ico"
<Directory "/var/www/html">
    <Files favicon.ico>
       ExpiresActive On
       ExpiresDefault "access plus 1 month"
    </Files>
</Directory>

그런 다음 단일 favicon.ico는 별명을 사용하기 때문에 모든 가상 호스팅 사이트에서 작동합니다. 사용자가 귀하의 사이트를 방문한 후에는 추가 방문이 웹이 아닌 한 달 동안 브라우저 캐시 사본을 그려집니다.

나는 얻을 수 없었다

ExpiresByType image/ico "access plus 1 month"

전혀 일합니다. 위에서 제안한대로 텍스트를 입력해야 할 수도 있습니다. 어쨌든 ExpiresDefault는 OK 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top