Jak ustawić nagłówki HTTP (dla kontroli pamięci podręcznej)?

237

Jak włączyć buforowanie przeglądarki dla mojej witryny? Czy po prostu umieszczam kontrolę pamięci podręcznej: public gdzieś w moim nagłówku w ten sposób?

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

Korzystam z najnowszej wersji PHP rozwijającej się na najnowszej wersji XAMPP.

Andrzej
źródło
jakiego używasz języka po stronie serwera? PHP ?, ASP ?, JSP? sposób ustawiania nagłówków jest podobny, ale niezupełnie taki sam. Lub jeśli buforujesz obrazy ... często dzieje się to w konfiguracji Apache (lub serwera WWW)
scunliffe
Niestety to „rozwiązanie” po prostu generuje nieprawidłowy DOCTYPE ;-) Jeśli chcesz to zrobić z HTMLa (nie poleciłbym tego),

Odpowiedzi:

198

Aby użyć kontroli pamięci podręcznej w HTML, używasz metatagu , np

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

Wartość w polu zawartości jest zdefiniowana jako jedna z czterech poniższych wartości.

Niektóre informacje w Cache-Controlnagłówku są następujące

HTTP 1.1. Dozwolone wartości = PUBLICZNE | PRYWATNE | NO-CACHE | BRAK SKLEPU.

Publiczne - mogą być buforowane w publicznych współdzielonych pamięciach podręcznych.
Prywatny - może być buforowany tylko w prywatnej pamięci podręcznej.
Brak pamięci podręcznej - nie może być buforowany.
No-Store - może być buforowany, ale nie archiwizowany.

Dyrektywa CACHE-CONTROL: NO-CACHE wskazuje, że buforowane informacje nie powinny być używane, a zamiast tego żądania powinny być przekazywane do serwera źródłowego. Ta dyrektywa ma taką samą semantykę jak PRAGMA: NO-CACHE.

Klienci POWINNI obejmować zarówno PRAGMA: NO-CACHE, jak i CACHE-CONTROL: NO-CACHE, gdy żądanie braku pamięci podręcznej zostanie wysłane do serwera, o którym nie wiadomo, że jest zgodny z HTTP / 1.1. Zobacz także: WAŻNE.

Uwaga: Lepszym rozwiązaniem może być określenie komend pamięci podręcznej w HTTP niż w instrukcjach META, które mogą mieć większy wpływ niż przeglądarka, ale proxy i inni pośrednicy, którzy mogą buforować informacje.

Codemwnci
źródło
30
HTML5 zabrania tego i <meta>zawsze był okropnym i niestabilnym sposobem określania buforowania.
Kornel
1
@porneL Mam problem ze zrozumieniem, która część twoich linków zabrania odpowiedzi na pytanie, która część odpowiedzi ... specyfikacja metatagu nie mówi nic o tym, że nie lubisz tego, co tu jest napisane, lub zabraniasz tego?
Félix Gagnon-Grenier
1
@ FélixGagnon-Grenier „Atrybut http-equiv jest atrybutem wyliczonym” oznacza, że ​​dopuszcza tylko wartości w tabeli w specyfikacji. Wywołuje nawet buforowanie w dalszej części („inne dyrektywy pragma”):> Dyrektywy Pragma odpowiadające nagłówkom wpływającym na model przetwarzania HTTP (np. Buforowanie) nie mogą być rejestrowane, ponieważ spowodowałyby, że zachowanie na poziomie HTTP byłoby inne dla programy klienckie, które implementują HTML, niż agenty użytkownika, które tego nie robią.
Kornel,
3
Cytowany dokument jest niepoprawny pod względem no-storewartości (pomimo, że sam dokument odwołuje się do RFC 2068 ) - no-storezapobiega przechowywaniu / buforowaniu dokumentu w dowolnym miejscu. Zważywszy, że no-cachezezwala on być przechowywany, ale musi sprawdzić się z serwerem za każdym razem. Przeglądarki zwykle przechowują no-cachestrony w celu włączenia funkcji przycisku Wstecz itp.
MrWhite
3
Google udostępnia jedną z najłatwiejszych referencji dotyczących buforowania HTTP IMO: developers.google.com/web/fundamentals/performance/…
MrWhite
137

Możesz ustawić nagłówki w PHP , używając:

<?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)

?>

Pamiętaj, że dokładne użyte nagłówki będą zależeć od twoich potrzeb (i jeśli potrzebujesz obsługi HTTP 1.0 i / lub HTTP 1.1 )

scunliffe
źródło
3
Pragmai Expiresprawdopodobnie są zbędne dla większości przeglądarek. fastly.com/blog/headers-we-dont-want
thijsai
1
@ thijsai yeah HTTP / 1.0 jest również bardzo nieaktualny ... używaj tylko potrzebnych nagłówków w oparciu o matrycę użytkownika
scunliffe
49

Jak napisałem, najlepiej użyć tego pliku .htaccess. Uważaj jednak na czas pozostawiania zawartości w pamięci podręcznej.

Posługiwać się:

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

Gdzie: 604800 = 7 dni

PS: Można go użyć do zresetowania dowolnego nagłówka

William
źródło
30

Strona http://www.askapache.com/htaccess/apache-speed-cache-control.html sugeruje użycie czegoś takiego:

Dodaj nagłówki kontroli pamięci podręcznej

Dotyczy to głównego pliku .htaccess, ale jeśli masz dostęp do httpd.conf, to lepiej.

Ten kod wykorzystuje dyrektywę FilesMatch i dyrektywę Header, aby dodać nagłówki Cache-Control do niektórych plików.

# 480 weeks
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=290304000, public"
</FilesMatch>
zły kiwi
źródło
3
Czy porządek jest w tym ważny? „maksymalny wiek = 290304000, publiczny” Lub „publiczny, maksymalny wiek = 290304000” czy oba są w równej mierze racja?
Satya Prakash
2
Kolejność nie ma znaczenia, jeśli wartości nie są sprzeczne (jak cachei no-cache). max-agei publicnie sprzeczajcie się, więc porządek nie ma znaczenia.
Blaise,
1
Zauważ, że ponieważ wykorzystuje Headerdyrektywę, musisz ją włączyć mod_headers.
Skippy le Grand Gourou
@ Skippy le Grand Gourou jak włączyć mod_headers?
Sam
@SamuelStratford Przeczytałem, że różni się w innych dystrybucjach, ale pod Debianem możesz użyć a2enmodlub utworzyć dowiązanie symboliczne od /etc/apache2/mods-available/headers.loaddo /etc/apache2/mods-enabled/headers.load.
Skippy le Grand Gourou
21

Oto najlepsze .htaccess, jakie wykorzystałem na mojej stronie:

<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>
Erich García
źródło
3
Prawie doskonały przykład pliku .htaccess ... Byłby kompletny, gdyby uwzględniono określone obrazy i jak zapisać ścieżkę do obrazu ORAZ gdzie umieścić plik .htaccess (np. W katalogu obrazu lub katalogu indeksu)? .. .na przykład. '<IfModule mod_headers.c> <Pliki /img/myimage.jpg> Nagłówek dołącza Cache-Control "max-age = 3600, must-revalidate" </Files> </IfModule>' ... czy to zadziała? .. . LUB ... lub wklejony do img dir '<dopasowanie plików "^ (przykład \ .jpg | sample \ .png) $"> Zestaw nagłówka Cache-Control "max-age = 31536000, public" </filesmatch>' .. . wszystko jedno strategia wydaje się ryzykowne - w każdym razie konkretne przykłady byłoby wspaniale, gdyby ewent
Marco-UandL
2
po prostu FYI: kompresja gzip na plikach JS i CSS może pomóc złamać szyfrowanie SSL. Jeśli polegasz na bezpieczeństwie, nie włączaj gzipa
Eduard Void
1
To buforowanie strony konta logowania, więc nie możesz się wylogować ze swojego konta. Co gorsza, ktoś nie może po prostu uzyskać dostępu do strony konta i zalogować się przy użyciu ostatniego logowania użytkownika. Nie zaleca się używania w witrynie eCommerce, dlatego należy usunąć, <filesMatch "\.(x?html?|php)$">aby uniknąć buforowania statycznych stron HTML. Reszta plików filmowych jest w porządku.
nicoX
1
Zduplikowano <filesmatch "\.(eot|woff|otf|ttf|svg)$">.
nicoX
2
Ustawić cssi jsdo prywatnej, jeśli masz buforowanie proxy. W twoim linku nie mogłem znaleźć żadnych rekomendacji. Większość CDN zaleca buforowanie tych wartości.
nicoX
14

W przypadku serwera Apache należy sprawdzić mod_expires w celu ustawienia nagłówków Expires i Cache-Control.

Alternatywnie możesz użyć dyrektywy Header, aby samodzielnie dodać kontrolę pamięci podręcznej:

Header set Cache-Control "max-age=290304000, public"
Peter Štibraný
źródło
5

Znacznik kontrolny meta cache pozwala wydawcom internetowym określić, w jaki sposób strony powinny być obsługiwane przez bufory. Obejmują one dyrektywy określające, co powinno być buforowalne, co może być przechowywane w pamięci podręcznej, modyfikacje mechanizmu wygasania oraz kontrolę rewalidacji i przeładowania.

Dozwolone wartości to:

Publiczny - może być buforowany w publicznych udostępnianych pamięciach podręcznych
Prywatny - może być buforowany tylko w prywatnej pamięci podręcznej
bez pamięci podręcznej - może nie być buforowany
bez przechowywania - może być buforowany, ale nie archiwizowany

Uważaj na wielkość liter. Dodaj następujący metatag w źródle strony. Różnica w pisowni na końcu tagu polega na tym, że używasz „/> = xml lub”> = 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">

Źródło- > MetaTagi

Karthik NG
źródło
korekta: no-store nie powinien być buforowany, żadna pamięć podręczna nie może być buforowana, ale musi zostać sprawdzona na serwerze przed zarezerwowaniem - patrz palizine.plynt.com/issues/2008Jul/cache-control-attributes
DangerMouse
Kontrola pamięci podręcznej no-store - no-store jest podobny do braku pamięci podręcznej, ponieważ odpowiedzi nie można buforować i ponownie użyć, jednak jest jedna ważna różnica. no-store wymaga każdorazowego żądania zasobu i pobrania go z serwera źródłowego. Jest to ważna funkcja w przypadku informacji prywatnych.
MarcoZen
5

OWASP zaleca:

O ile to możliwe, upewnij się, że nagłówek HTTP sterujący pamięcią podręczną jest ustawiony na no-cache, no-store, must-revalidate, private; i że nagłówek HTTP pragma jest ustawiony bez pamięci podręcznej.

<IfModule mod_headers.c>
    Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
    Header set Pragma "no-cache"
</IfModule>
Zwycięstwo Jun Bae
źródło