Apache를 사용한 웹사이트 이미지 캐싱
-
22-07-2019 - |
문제
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>
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 작동합니다.