Como definir cabeçalhos HTTP (para controle de cache)?

237

Como habilitar o cache do navegador para o meu site? Acabei de colocar cache-control: public em algum lugar no meu cabeçalho como este?

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

Estou usando a versão mais recente do PHP em desenvolvimento na versão mais recente do XAMPP.

andrew
fonte
qual idioma do servidor você está usando? PHP ?, ASP ?, JSP? a maneira como você define os cabeçalhos é semelhante, mas não é a mesma coisa. Ou se você estiver cache imagens ... muitas vezes isso é feito em sua (ou servidor web) configuração do Apache
scunliffe
Infelizmente essa "solução" simplesmente gera um DOCTYPE inválido ;-) Se você deseja fazê-lo em HTML (eu não o recomendaria), usaria o META HTTP-EQUIV

Respostas:

198

Para usar o controle de cache em HTML, use a metatag , por exemplo

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

O valor no campo de conteúdo é definido como um dos quatro valores abaixo.

Algumas informações no Cache-Controlcabeçalho são as seguintes

HTTP 1.1. Valores permitidos = PUBLIC | PRIVADO NO-CACHE NO-STORE.

Público - pode ser armazenado em cache em caches públicos compartilhados.
Privado - só pode ser armazenado em cache no cache privado.
Sem cache - não pode ser armazenado em cache.
No-Store - pode ser armazenado em cache, mas não arquivado.

A diretiva CACHE-CONTROL: NO-CACHE indica que as informações em cache não devem ser usadas e, em vez disso, as solicitações devem ser encaminhadas ao servidor de origem. Esta diretiva tem a mesma semântica que o PRAGMA: NO-CACHE.

Os clientes devem incluir PRAGMA: NO-CACHE e CACHE-CONTROL: NO-CACHE quando uma solicitação sem cache é enviada para um servidor que não é conhecido por ser compatível com HTTP / 1.1. Veja também EXPIRES.

Nota: Pode ser melhor especificar comandos de cache em HTTP do que em instruções META, onde eles podem influenciar mais do que o navegador, mas proxies e outros intermediários que podem armazenar informações em cache.

Codemwnci
fonte
30
O HTML5 proíbe isso e <meta>sempre foi uma maneira terrível e esquisita de especificar o cache.
Kornel
1
@porneL Não consigo entender qual parte de seus links proíbe qual parte da resposta ... as especificações da metatag não dizem nada sobre não gostar do que está escrito aqui ou proibi-lo?
Félix Gagnon-Grenier
1
@ FélixGagnon-Grenier "O atributo http-equiv é um atributo enumerado" significa que permite apenas valores na tabela na especificação. Ele até chama o cache na seção posterior ("outras diretivas pragma"):> As diretivas pragma correspondentes aos cabeçalhos que afetam o modelo de processamento HTTP (por exemplo, cache) não devem ser registradas, pois resultariam em um comportamento no nível HTTP diferente para agentes de usuário que implementam HTML do que para agentes de usuário que não.
Kornel
3
O documento citado não está correto em relação ao no-storevalor (apesar do próprio documento referenciar a RFC 2068 ) - no-storeimpede que o documento seja armazenado / armazenado em cache, em qualquer lugar. Considerando no-cacheque permite que ele seja armazenado, mas deve verificar sempre com o servidor. Navegadores tendem a armazenar no-cachepáginas para habilitar a funcionalidade botão voltar etc.
MrWhite
3
Google fornece uma das referências mais fáceis para HTTP caching IMO: developers.google.com/web/fundamentals/performance/...
MrWhite
137

Você pode definir os cabeçalhos no PHP usando:

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

?>

Observe que os cabeçalhos exatos usados ​​dependerão de suas necessidades (e se você precisar oferecer suporte a HTTP 1.0 e / ou HTTP 1.1 )

scunliffe
fonte
3
Pragmae Expiresprovavelmente são redundantes para a grande maioria dos navegadores. fastly.com/blog/headers-we-dont-want
thijsai
1
@thijsai sim HTTP / 1.0 é maciçamente fora de data também ... uso apenas os cabeçalhos que você precisa com base em sua matriz usuário
scunliffe
50

Como escrevi, é melhor usar o arquivo .htaccess. No entanto, tenha cuidado com o tempo em que você deixa o conteúdo no cache.

Usar:

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

Onde: 604800 = 7 dias

PS: pode ser usado para redefinir qualquer cabeçalho

William
fonte
30

A página em http://www.askapache.com/htaccess/apache-speed-cache-control.html sugere o uso de algo como isto:

Adicionar cabeçalhos de controle de cache

Isso ocorre no seu arquivo .htaccess raiz, mas se você tiver acesso ao httpd.conf, é melhor.

Esse código usa a diretiva FilesMatch e a diretiva Header para adicionar cabeçalhos de controle de cache a determinados arquivos.

# 480 weeks
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=290304000, public"
</FilesMatch>
kiwi com raiva
fonte
3
A ordem é importante? "idade máxima = 290304000, pública" Ou "público, idade máxima = 290304000" ou ambas estão igualmente corretas?
Satya Prakash
2
A ordem não importa se os valores não são conflitantes (como cachee no-cache). max-agee publicnão entre em conflito, portanto, a ordem não importa.
Blaise
1
Observe que, como ele usa a Headerdiretiva, você deve habilitar mod_headers.
Skippy le Grand Gourou
@ Skippy le Grand Gourou como ativar mod_headers?
Sam
@SamuelStratford Eu li que difere de outras distribuições, mas no Debian você pode usar a2enmodou criar um link simbólico de /etc/apache2/mods-available/headers.loadpara /etc/apache2/mods-enabled/headers.load.
Skippy le Grand Gourou
21

Este é o melhor .htaccessque usei no meu site atual:

<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
fonte
3
Exemplo quase perfeito de um arquivo .htaccess ... Seria completo se imagens específicas fossem incluídas e como escrever o caminho para a imagem E onde colocar o arquivo .htaccess (por exemplo, no diretório de imagem ou no diretório de índice)? .. .por exemplo. '<IfModule mod_headers.c> <Arquivos /img/myimage.jpg> Cabeçalho anexa Controle de cache "max-age = 3600, deve revalidar" </Files> </IfModule>' ... isso funcionaria? .. . OU ... ou colado no img dir '<filesmatch "^ (exemplo \ .jpg | sample \ .png) $"> Cabeçalho definido como Controle de cache "max-age = 31536000, público" </filesmatch>' .. . Um tudo a mesma estratégia parece arriscada - de qualquer maneira exemplos específicos seria ótimo se poss
Marco-UandL
2
apenas a compactação FYI: gzip em arquivos JS e CSS pode ajudar a quebrar sua criptografia SSL. Se você confiar na segurança, não ligue gzip on
Eduard Vazio
1
Isso está armazenando em cache a página da conta de login, para que você não possa sair da sua conta. Pior ainda, alguém não pode simplesmente acessar a página da conta e fazer login com o último login do usuário. Não é aconselhável usar em um site de comércio eletrônico; remova-o <filesMatch "\.(x?html?|php)$">para evitar que páginas HTML estáticas sejam armazenadas em cache. O restante das correspondências de arquivo está ok.
NicoX 25/05
1
Você duplicou <filesmatch "\.(eot|woff|otf|ttf|svg)$">.
NicoX 26/05
2
Você define csse jscomo privado se tiver cache de proxy. Não encontrei recomendações no seu link sobre isso. A maioria das CDNs recomenda que você armazene esses valores em cache.
NicoX 28/05
14

Para servidor Apache, você deve verificar mod_expires para definir os cabeçalhos Expir e Cache-Control.

Como alternativa, você pode usar a diretiva Header para adicionar o Controle de cache por conta própria:

Header set Cache-Control "max-age=290304000, public"
Peter Štibraný
fonte
5

A tag de controle de meta cache permite que os editores da Web definam como as páginas devem ser tratadas pelos caches. Eles incluem diretrizes para declarar o que deve ser armazenado em cache, o que pode ser armazenado por caches, modificações do mecanismo de expiração e controles de revalidação e recarregamento.

Os valores permitidos são:

Público - pode ser armazenado em cache em caches públicos compartilhados
Privado - pode ser armazenado em cache somente em cache privado
no-Cache - não pode ser armazenado em cache
no-Store - pode ser armazenado em cache, mas não arquivado

Por favor, tenha cuidado com a distinção entre maiúsculas e minúsculas. Adicione a seguinte metatag na fonte da sua página da web. A diferença na ortografia no final da tag é: "/> = xml ou"> = 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">

Fonte-> MetaTags

Karthik NG
fonte
correção: nenhum armazenamento não deve ser armazenado em cache, nenhum cache pode ser armazenado em cache, mas deve ser verificado com o servidor antes de ser reservado - consulte palizine.plynt.com/issues/2008Jul/cache-control-attributes
DangerMouse
Controle de cache sem armazenamento - sem armazenamento é semelhante ao sem cache, pois a resposta não pode ser armazenada em cache e reutilizada, no entanto, há uma diferença importante. o no-store exige que o recurso seja solicitado e baixado do servidor de origem todas as vezes. Esse é um recurso importante ao lidar com informações particulares.
MarcoZen 12/02
5

A OWASP recomenda o seguinte:

Sempre que possível, assegure-se de que o cabeçalho HTTP de controle de cache esteja definido com no-cache, no-store, must-revalidate, private; e que o cabeçalho HTTP pragma seja definido sem cache.

<IfModule mod_headers.c>
    Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
    Header set Pragma "no-cache"
</IfModule>
Ganhou Jun Bae
fonte