Cache de navegador com .htaccess

Cache de Navegador com .htaccess
Todo Webmaster sabe que é essencial realizar cache de navegador para os arquivos de um site por diversos motivos, entre eles economizar banda, acelerar o carregamento e principalmente, melhorar a experiência do usuário. Entretanto as informações sobre este tema ou até mesmo os guias oficiais são confusos, na maior parte em inglês, o que dificulta muito para os iniciantes. Pretendo neste guia abordar todas as maneiras de se realizar cache de navegador utilizando o arquivo de controle .htaccess do Apache e dessa forma, criar o primeiro guia brasileiro sobre o assunto.

Com a evolução da Internet, a tendência é que os sites passem a ser mais dinâmicos e ricos em conteúdo. A experiência do usuário nos últimos anos foi elevada a patamares inimagináveis, mas tudo tem o seu preço. Para se criar um site é necessário o uso de diversos tipos de arquivos, como textos, imagens, mídias e etc. A partir do momento que o usuário acessa um site, é baixado para o seu navegador todos estes arquivos, e a cada novo acesso tudo é novamente carregado, causando desperdício de banda e lentidão.

 

O que é Cache?

Antes de tecer comentários sobre o Apache, o arquivo de controle .htaccess e servidores, vamos entender o que é o Cache de navegador. A partir do momento que o usuário acessa o seu site, todo o conteúdo disponível tais como imagens, estilos e etc é baixado para o seu computador, permanecendo em uma área temporária do disco rígido. A partir do primeiro acesso podemos instruir o navegador a guardar estes arquivos anteriormente baixados em um local especial chamado Cache, assim como definir o tempo que ele ficará armazenado. Assim, quando o usuário acessar o seu site novamente ou navegar por outras páginas, ao invés de precisar baixar toda a página novamente, o navegador será instruído a buscar os conteúdos diretamente do Cache. Caso ele não tenha algo no Cache ou o tempo de permanência tenha expirado, é solicitado o arquivo em questão ao servidor do site.

É muito mais rápido buscar algo do Cache do que em um servidor web, que muitas vezes está em outro país.

 

Como funciona o acesso a um site?

Quando um site é acessado, ocorrem diversos pedidos pelo navegador e respostas pelo servidor do site. Nestes pedidos são enviados informações referente ao tipo de conteúdo, linguagem esperada, e etc. Isto é conhecido como Request Header ou Cabeçalho de Requisição. Após este pedido o servidor retorna a resposta, com as imagens, textos, estilos e etc. Este é o Response Header ou Cabeçalho de Resposta. Para um site comum são enviados em média 80 Requests Headers e recebidos consequentemente 80 Responses Headers. Para cada pedido uma resposta. Veja na imagem abaixo o acesso ao site do Google (No exemplo, 1 pedido e 1 resposta):

Pedido ao site do Google (Request Header)

GET / HTTP/1.1
Host: www.google.com.br
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive

Resposta do servidor (Response Header)

HTTP/1.1 200 OK
Date: Sat, 21 Jan 2012 08:49:54 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Server: gws
Content-Length: 18390
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

Notem que o servidor do Google enviou a resposta OK para o pedido. Existem diversos tipos de respostas, isso você pode estudar aqui. Quanto mais solicitações HTTP como essas ocorrerem em um acesso a um site, mais tempo vai levar para a página ser completamente carregada para o usuário. Por isso a necessidade do Cache, com ele, como já foi falado, é possível buscar o conteúdo na própria máquina do usuário desde que este conteúdo já esteja armazenado em Cache. Diminuindo as requisições HTTP, aumentamos a velocidade de um site.

 

Cache de navegador com .htaccess
Módulos que precisam estar ativos no Apache: mod_expires e mod_headers

Após esta pequena introdução de como funciona o acesso a um site, vamos aprender como realizar um Cache eficiente no servidor Apache, utilizando o arquivo de controle .htaccess. A partir daqui pressupôe-se que você tenha conhecimentos mínimos de desenvolvimento web e que saiba criar e/ou manipular o arquivo .htaccess.

Existem duas formas de se realizar Cache com .htaccess:

  1. Cabeçalho Expires: Com o cabeçalho expires é possível determinar a expiração de um arquivo, colocando-o assim em Cache. Ele deve ser utilizado para navegadores que utilizam o protocolo HTTP 1.0 para a comunicação com o servidor.
  2. Cabeçalho Cache-Control: Com o cabeçalho Cache-Control é possível determinar a expiração de um arquivo, colocando-o assim em Cache. Além disso é possível determinar vários parâmetros adicionais, como tornar o Cache público ou privado. Ele deve ser utilizado para navegadores que utilizam o protocolo HTTP 1.1 para a comunicação com o servidor.

A dúvida de muitos é sobre qual usar? O correto é usar os dois, definidos com os mesmos tempos de expiração, pois o navegador que trabalhar com o protocolo HTTP 1.0 utilizará o Expires, já os navegadores modernos que trabalharem com o HTTP 1.1, utilizarão o Cache-Control.

 

Utilizando o Cache com Expires

Em seu arquivo .htaccess vamos enviar ao navegador o cabeçalho expires. Atenção, se os módulos apache mod_expires e mod_headers estiverem desativados em sua hospedagem, irá ocorrer um erro 500 em seu servidor.

ExpiresActive On

Com isso, será ativo o Expires. Agora precisamos definir o tempo de cache para cada tipo de arquivo ou para todos ao mesmo tempo:

ExpiresByType

Com o ExpiresByType, definimos o tipo de arquivo que receberá determinado tempo de expiração. O tempo de expiração pode ser informado em segundos, minutos, horas, dias, semanas, meses e anos, sempre respeitando as regras de sintaxe corretas.

No exemplo abaixo, vamos definir um tempo de Expires padrão (default) para todos os tipos de arquivos (1 dia):

ExpiresActive On
ExpiresDefault "access plus 1 day"

No exemplo abaixo, vamos utilizar o ExpiresByType para definir um cache de 7 dias para imagens JPEG. Assim, quando o usuário acessar o site pela primeira vez, irá receber a imagem em seu navegador com a instrução de cache. Caso ele acesse novamente o site nos próximos 7 dias, receberá a imagem em cache do seu próprio navegador.

ExpiresActive On
ExpiresByType image/jpeg "access plus 7 days"

Outros exemplos de utilização:

ExpiresActive On
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType application/json "access plus 0 seconds"

# Feed RSS - 1 hora
ExpiresByType application/rss+xml "access plus 1 hour"

# Favicon - 1 semana
ExpiresByType image/vnd.microsoft.icon "access plus 1 week"

# Imagens, vídeo, audio - 1 semana
ExpiresByType image/gif "access plus 1 week"
ExpiresByType image/png "access plus 1 week"
ExpiresByType image/jpg "access plus 1 week"
ExpiresByType image/jpeg "access plus 1 week"

ExpiresByType video/ogg "access plus 1 week"
ExpiresByType audio/ogg "access plus 1 week"
ExpiresByType video/mp4 "access plus 1 week"
ExpiresByType video/webm "access plus 1 week"

# Webfonts - 1 ano
ExpiresByType font/truetype "access plus 1 year"
ExpiresByType font/opentype "access plus 1 year"
ExpiresByType font/woff "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"

# CSS / jScript - 5 dias e 2 horas
ExpiresByType text/css "access plus 5 days 2 hours"
ExpiresByType application/javascript "access plus 5 days 2 hours"
ExpiresByType text/javascript "access plus 5 days 2 hours"

Você pode também aplicar / desativar o Expires em arquivos específicos, com a função FilesMatch (Expressão Regular):

# Expires somente no arquivo estilo.css, formato GMT
<FilesMatch "estilo\.css$">
Header set Expires "Thu, 15 Apr 2012 20:00:00 GMT"
</FilesMatch>

# Desativar Expires somente no arquivo index.html
<FilesMatch "estilo\.css$">
Header unset Expires
</FilesMatch>

O único problema de se utilizar Expires para arquivos específicos é que seria necessário estar sempre alterando o tempo de Expiração no código, visto que não é feito um “plus” automático como no Exemplo anterior.

 

Utilizando o Cache com Cache-Control

A função do Cache-Control é exatamente a mesma do Expires, determinar o tempo de expiração (somente em segundos) para qualquer tipo de arquivo, e ainda determinar o tipo do cache, se ele será público, privado e etc. Apenas navegadores modernos reconhecem o cabeçalho Cache-Control.

O Cache-Control pode receber 7 informações (separadas por vírgula):

  • Max-Age: A informação mais importante. Com ela definimos em segundos o tempo de expiração;
  • Tipo de Cache:
  • Public: O conteúdo do cache estará disponível para todos os usuários que utilizarem um mesmo navegador (em alguns navegadores é possível utilizar vários usuários). Sempre use o Tipo de Cache Public quando for utilizar em sites com SSL (HTTPS), pois existem alguns conflitos ao utilizar outros tipos, relacionados à cache e servidores proxys ;
  • Private (default): O conteúdo do cache estará disponível apenas para o usuário específico;
  • No-Cache: Não é armazenado em Cache;
  • No-Store: O Cache é feito de forma temporária, não é armazenado;
  • Must-Revalidate: Seguir rigorosamente as minhas regras de cache;
  • Proxy-Revalidate: O mesmo do anterior, só que válido para proxys;

No exemplo abaixo, vamos definir um Cache-Control para imagens com tempo de 4 horas

# Cache-Control de 4 horas (14400 segundos) de tipo público
<FilesMatch "\.(jpg|jpeg|png|gif|ico)$">
Header set Cache-Control "max-age=14400, public"
</FilesMatch>

Podemos fazer usando somente as extensões dos arquivos como no exemplo acima, ou declarando o nome do arquivo individuamente  (ou os nomes dos arquivos, se for mais de um):

# Cache-Control de 4 horas (14400 segundos) de tipo público
<FilesMatch "(estilo\.css|imagem\.jpg)$">
Header set Cache-Control "max-age=14400, public"
</FilesMatch>

Caso queira desativar o cache para certos tipos de arquivos, ou certas extensões:

# Desativar cache para o arquivo index.php
# O cabeçalho "pragma" é para compatibilidade com o IE
<FilesMatch "index\.php$">
ExpiresActive Off
Header set Cache-Control "max-age=0, private, no-store, no-cache, must-revalidate"
Header set Pragma "no-cache"
</FilesMatch>

 

Validadores de Cache

A fim de melhorar a performance do Cache, foram implementados os validadores de Cache (E-tag e Last-Modified). A idéia é atualizar o cache quando o arquivo no servidor for atualizado. A princípio a idéia é ótima e todos deveriam usar os validadores, mas ao usá-los, sempre que alguém atualizar a página (F5), são enviados vários pedidos adicionais ao servidor para ver se o arquivo mudou, e isso pode ocasionar mais lentidão no acesso.

Temos dois tipos de validadores, a E-Tag e o Last-Modified. Ambos possuem a mesma função, identificar o tempo de criação de um arquivo, tornando o cache dessa maneira mais eficiente. O E-tag é um identificador único para cada arquivo, baseado no tempo de criação ou em seu tamanho. Com isso, o servidor consegue identificar se o arquivo em cache na máquina do usuário é diferente do arquivo no servidor, decidindo se o arquivo será ou não atualizado.

O Last-Modified é um pouco mais eficiente que o E-Tag, pois lida unicamente com a data de modificação do arquivo. Se o arquivo no servidor for mais recente, o cache será atualizado, caso contrário será retornado uma resposta que o arquivo ainda não precisa ser baixado. pois são iguais no servidor e no cache.

Como funciona?
Ao usar os validadores de cache, sempre que o tempo de expiração acabar ou o usuário atualizar a página (F5), o navegador irá perguntar ao servidor se o arquivo mudou (enviando o cabeçalho If-Modified-since se você usar o Last-Modified ou If-None-Match se você usar o E-Tag). O servidor então verifica se o arquivo foi modificado ou atualizado, se sim, ele envia o arquivo com a resposta “200 OK”, caso contrário, ele retorna a resposta “304 Not Modified”.

Vantagem de usar os validadores de cache
O cache será atualizado sempre que o arquivo no servidor mudar, e o usuário atualizar a página. Isso é especialmente útil em sistemas baseados em Ajax, pois assim os arquivos estáticos vinculados ao Ajax (JS) sempre serão atualizados.

Desvantagem de usar os validadores de cache
O navegador fará mais pedidos HTTP GET ao servidor e consequentemente receberá as respostas 200 ou 304 caso não mudou. Isso causará um maior consumo de trafégo do servidor, e um pouco mais de lentidão no acesso. Ao desabilitar os validadores o navegador confiará cegamente no tempo de expiração definido em Expires e Cache-Control.

Um outro problema com as E-Tags é que elas são construídas usando atributos que as tornam únicas para um servidor específico. A E-Tag não vai corresponder quando um navegador recebe o componente original de um servidor e depois tenta validar esse componente em um servidor diferente, uma situação que é muito comum em sites da Web que usam clusters ou nodes de servidores para lidar com solicitações.

Eu particularmente não gosto de usar estes validadores, que apesar de serem úteis no ponto de manter o cache atualizado quando a página é recarregada, causa mais lentidão de acesso e um maior consumo de banda. Em meus projetos, eu prefiro removê-los, fazendo o navegador confiar cegamente no Expires / Cache-Control:

Header unset Etag
FileETag None
Header unset Last-Modified

Caso você não esteja usando os validadores e queira usar, faça assim:

FileEtag Mtime size
#O last-modified irá aparecer por padrão

Dicas de uso

    • Só use os validadores de cache (Last-Modified ou E-Tag) se você NÃO estiver usando o Expires e o Cache-Control.
    • Nos testes que você for fazendo no .htaccess, recomendo que você desligue o gerenciamento de cache do seu navegador no menu de opções (consulte o manual do navegador) ou sempre que for necessário, limpe o cache para testar as alterações.
    • Se for usar o validador de cache, não use os dois. Desabilite o E-tag ou o Last-Modified, para evitar redundância.
    • Se você utilizar o Firefox ou o Chrome, instale a extensão Firebug para monitorar se os arquivos estão ficando em cache corretamente. No painel “rede” do firebug, todos os arquivos em cache ficam da cor cinza claro.

Bem, acredito que este é o maior guia de cache brasileiro, eu pelo menos não encontrei nenhum tão completo e em português como este, por isto decidi escrever. Espero que vocês desenvolvedores WEB, tenham aprendido as melhores formas de implementar cache de navegador. Num próximo artigo em mostro como implementar cache com diversos servidores.

Fontes:
http://gtmetrix.com/leverage-proxy-caching.html
http://gtmetrix.com/leverage-browser-caching.html
http://www.askapache.com/htaccess/apache-speed-expires.html
http://httpd.apache.org/docs/2.0/mod/mod_expires.html
http://www.mnot.net/cache_docs/
http://homepages.dcc.ufmg.br/~joaoreis/Site%20de%20tutoriais/cdtc/cod-http.html
http://imasters.com.br/artigo/20286/redes-e-servidores/htaccess-direto-ao-ponto
http://developer.yahoo.com/performance/rules.html

Lucas Peperaio

Estudante de Ciência da Computação, trabalho com desenvolvimento web há 5 anos e com hardware há 8. Nas horas vagas, sou entusiasta de Overclock, Casemod e Benchmarks, além é claro dos Games. Apaixonado por informática e pela vida, procuro compartilhar meus conhecimentos e assim, ajudar as pessoas. Siga-me no youtube, posto semanalmente muito material sobre Hardware, tecnologia e games em geral: Clique aqui

Receba gratuitamente em seu E-mail
Novos artigos do meu Blog!


Após o Cadastro você receberá um Email Automático. Clique no link enviado para Ativar e receber as novidades.

Categorias do site





19 Comentários Deixe o seu

  1. Lucas

    Realmente, é o único conteúdo que encontrei no Brasil.

  2. Anúncios grátis

    Olá, tenho sempre acompanhado seus artigos de otimização, no qual tenho tido boas experiência com meu site, tudo de bom em seu trabalho parabens..

    Fica com Deus…

  3. Lucas Moreira

    Muito bom o artigo!! Parabéns!

  4. palmer

    muito legal o post, parabens..tenho só uma duvida…quando coloco por exemplo um estilo.css no cache por 2 dias…entao altero algo no css, para que se propague para os usuarios, eu teria que colocar o cache para 0, e ai vai atualizar o css para todos ? Pois tenho duvida disso, o que fazer na hora de atualizar o js,css …valeu

    • Rafael Ávila

      Boa tarde palmer, encontrei esse arquivo na net e o Lucas está de parabéns.

      Sobre o seu problema você deve usar um controle de versão para seus arquivos ou você muda o seu nome quando atualizar e controle manualmente em uma planilha, por exemplo: style-v01.css -> quando for modificar esse arquivo coloque style-v02.css, pois se você deixar o mesmo nome o usuário não terá a atualização que você desejou, pois o navegador ao verificar o nome do arquivo no servidor ele identificará como o mesmo arquivo, daí prevalecerá a sua data de expiração. Os controles de versão geralmente usam datas por exemplo.

      • Lucas Peperaio

        Palmer e Rafael, existe uma forma melhor de fazer isso. É só usar o 304 not modified ou o FileEtag, eles já fazem essa validação

  5. Leandro

    Cara, show de bola suas dicas.. muito úteis.. Obrigado mesmo! estou aprendendo muito sobre isso.

    vlw

  6. renato

    Parabéns meu amigo…. muito bem explicado…. vou testar no meu site… e verei os resultados, mas tudo indica que fusionará tudo muito bem……

  7. Claudio

    Lucas, colocamos os códigos correspondentes mas o Page Speed teima em nos dizer que as imagens e os css não tem expiração especificada. Coloquei até um plugin de WP, mas deu na mesma. Que poderá estar acontecendo?

    O código no .ataccess

    #Força a utilizar Cache-Control e Expires header

    Header unset ETag

    FileETag None

    ExpiresActive on ExpiresDefault “access plus 1 month” ExpiresByType text/cache-manifest “access plus 0 seconds” # Html ExpiresByType text/html “access plus 0 seconds” # Data ExpiresByType text/xml “access plus 0 seconds” ExpiresByType application/xml “access plus 0 seconds” ExpiresByType application/json “access plus 0 seconds” # Feed ExpiresByType application/rss+xml “access plus 1 hour” ExpiresByType application/atom+xml “access plus 1 hour” # Favicon ExpiresByType image/x-icon “access plus 1 week” # Media: images, video, audio ExpiresByType image/gif “access plus 1 month” ExpiresByType image/png “access plus 1 month” ExpiresByType image/jpg “access plus 1 month” ExpiresByType image/jpeg “access plus 1 month” ExpiresByType video/ogg “access plus 1 month” ExpiresByType audio/ogg “access plus 1 month” ExpiresByType video/mp4 “access plus 1 month” ExpiresByType video/webm “access plus 1 month” # HTC files ExpiresByType text/x-component “access plus 1 month” # Webfonts ExpiresByType application/x-font-ttf “access plus 1 month” ExpiresByType font/opentype “access plus 1 month” ExpiresByType application/x-font-woff “access plus 1 month” ExpiresByType image/svg+xml “access plus 1 month” ExpiresByType application/vnd.ms-fontobject “access plus 1 month” # CSS / JS ExpiresByType text/css “access plus 1 year” ExpiresByType application/javascript “access plus 1 year” ExpiresByType application/x-javascript “access plus 1 year”

    #Força o IE a sempre carregar utilizando a última versão disponível

    Header set X-UA-Compatible “IE=Edge,chrome=1”

    Header unset X-UA-Compatible

  8. Thiago Fuda

    Show de bola Lucas. Você conseguiu se atentar a detalhes bem relevantes como a ativação do módulos no Apache.

    Se me permite, gostaria de acrescentar o nome do modulo no Debian/Ubuntu. /etc/apache2/mods-available/

    expires.load headers.load

    Minha configuração no .htaccess ficou da seguinte forma:

    ExpiresActive On ExpiresByType text/html “access plus 1 hour” ExpiresByType text/xml “access plus 1 hour” ExpiresByType application/xml “access plus 1 hour” ExpiresByType application/json “access plus 1 hour”

    # Favicon – 1 semana ExpiresByType image/vnd.microsoft.icon “access plus 1 week”

    # Imagens 1 semana ExpiresByType image/gif “access plus 1 week” ExpiresByType image/png “access plus 1 week” ExpiresByType image/jpg “access plus 1 week” ExpiresByType image/jpeg “access plus 1 week”

    # Webfonts – 1 ano ExpiresByType font/truetype “access plus 1 year” ExpiresByType font/opentype “access plus 1 year” ExpiresByType font/woff “access plus 1 year” ExpiresByType image/svg+xml “access plus 1 year”

    # CSS / jScript – 12 horas ExpiresByType text/css “access plus 12 hours” ExpiresByType application/javascript “access plus 12 hours” ExpiresByType text/javascript “access plus 12 hours”

  9. Iracema

    Incrível sua abordagem. Realmente não encontrei nada parecido em português e me deu um grande upgrade! Parabéns, voltarei sempre!

  10. joao

    como faço para configurar as tag de cabeçalho.

  11. Rodrigo

    Ótimo texto, obrigado! :)

  12. iPhone 6 Case

    Amazon.com: iPhone 6 Case, Spigen Tough Armor Case for iPhone 6 (4.7-Inch) – Retail Packaging – Gunmetal (SGP11022): Cell Phones & Accessories

  13. Carlos

    Gostei muito do artigo e me ajudou muito no meu problema !!! Parabéns !!!!!

  14. Gustavo

    Oi Lucas, parabéns pelo conteúdo!

    Realmente, em português deve ser um dos únicos artigos, ficou ótimo!

    Estou com um probleminha na implementação do cache. Meu servidor web não possui mod_expires em ambiente compartilhado, que é o meu caso.

    Possuo apenas o mod_headers. Qual a melhor forma de alterar o htaccess utilizando apenas o mod_headers?

    Obrigado cara!!! Valeu!

  15. Rui Boto

    Olá, muito bem explicado, realmente em portugues não existe muita informação… Tenho estado a optimizar o meu site, no entanto existem 4 recursos que não consigo por em cache, gostaria de saber se me pode ajudar. Os ficheiros que estão é falta são estes: http://load.s3.amazonaws.com/pixel.gif (data de expiração não especificada) http://dsms0mj1bbhn4.cloudfront.net/assets/pub/shareaholic.js (10 minutos) http://www.google-analytics.com/analytics.js (2 horas) http://px.owneriq.net/…holic&eid=1693&uid=Q5133684192098350452J (9,8 horas)

    e o meu htacess está assim:

    #Força a utilizar Cache-Control e Expires header

    Header unset ETag

    FileETag None

    ExpiresActive on ExpiresDefault “access plus 1 month” ExpiresByType text/cache-manifest “access plus 0 seconds” # Html ExpiresByType text/html “access plus 0 seconds” # Data ExpiresByType text/xml “access plus 0 seconds” ExpiresByType application/xml “access plus 0 seconds” ExpiresByType application/json “access plus 0 seconds” # Feed ExpiresByType application/rss+xml “access plus 1 hour” ExpiresByType application/atom+xml “access plus 1 hour” # Favicon ExpiresByType image/x-icon “access plus 1 week” # Media: images, video, audio ExpiresByType image/gif “access plus 1 month” ExpiresByType image/png “access plus 1 month” ExpiresByType image/jpg “access plus 1 month” ExpiresByType image/jpeg “access plus 1 month” ExpiresByType video/ogg “access plus 1 month” ExpiresByType audio/ogg “access plus 1 month” ExpiresByType video/mp4 “access plus 1 month” ExpiresByType video/webm “access plus 1 month” # HTC files ExpiresByType text/x-component “access plus 1 month” # Webfonts ExpiresByType application/x-font-ttf “access plus 1 month” ExpiresByType font/opentype “access plus 1 month” ExpiresByType application/x-font-woff “access plus 1 month” ExpiresByType image/svg+xml “access plus 1 month” ExpiresByType application/vnd.ms-fontobject “access plus 1 month” # CSS / JS ExpiresByType text/css “access plus 1 year” ExpiresByType application/javascript “access plus 1 year” ExpiresByType application/x-javascript “access plus 1 year”

    #Força o IE a sempre carregar utilizando a última versão disponível

    Header set X-UA-Compatible “IE=Edge,chrome=1”

    Header unset X-UA-Compatible

    # BEGIN WordPress

    RewriteRule ^index\.php$ – [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]

    # END WordPress

    Tem alguma ideia do que está faltando? Desde já muito obrigado pelo seu excelente post

  16. Tarsis Cruz

    Cara! Parabéns! Conteúdo de muita qualidade. Valeu, me ajudou pra caramba!