IIS7 Cache-Control

95

Estou tentando fazer algo que achei bastante simples. Obtenha o IIS 7 para informar aos clientes que eles podem armazenar em cache todas as imagens do meu site por um determinado período, digamos 24 horas.

Tentei a etapa em http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx, mas sem sucesso. Ainda recebo solicitações indo para o servidor com 304s sendo retornados.

Alguém tem uma maneira de fazer isso? Tenho um site graficamente intensivo e meus usuários estão sendo martelados (assim como meu servidor) toda vez que solicitam uma página. Estranhamente, as imagens parecem ter "Cache-Control private, max-age = 3600" aparecendo no Firebug, mas o navegador ainda está solicitando quando eu pressiono F5.

Chris Meek
fonte

Respostas:

124

Se você deseja definir o cabeçalho Cache-Control, infelizmente não há nada na IU do IIS7 para fazer isso.

No entanto, você pode colocar este web.config na raiz da pasta ou site onde deseja defini-lo:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

Isso informará o cliente para armazenar o conteúdo em cache por 7 dias nessa pasta e em todas as subpastas.

Você também pode fazer isso editando a metabase IIS7 por meio da seguinte appcmd.exeforma:

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  definir config "Site / pasta padrão" 
  -section: system.webServer / staticContent 
  -clientCache.cacheControlMode: UseMaxAge

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  definir config "Site / pasta padrão" 
  -section: system.webServer / staticContent 
  -clientCache.cacheControlMaxAge: "7.00: 00: 00"
Jeff Atwood
fonte
5
A documentação do MSDN para o elemento de configuração staticContent pode ser encontrada aqui: msdn.microsoft.com/en-us/library/ms689443.aspx
Milan Gardian
4
Veja as postagens do 360Airwalk abaixo, há uma IU para isso no IIS7
ChadT
Apenas como uma informação: esta configuração parece não ter efeito no Servidor de Desenvolvimento integrado (do VS 2010 SP1 pelo menos). Em caso de dúvida por que não funciona, verifique com o IIS.
6
Olá, Jeff, você sabe como servir cabeçalhos diferentes Cache-Control( max-age) para tipos MIME ou extensões de arquivos diferentes?
Jasper
@Jeff Atwood Talvez você possa me ajudar. Olhe para isto: stackoverflow.com/questions/57990579/…
Success Man
115

Isso não é verdade Jeff.

Basta selecionar uma pasta na IU do IIS 7 Manager (por exemplo, Imagens ou pasta do aplicativo da Web padrão) e clicar em "Cabeçalhos de resposta HTTP". Então você tem que clicar em "Set Common Header .." no painel direito e selecionar "Expire Web content". Lá você pode configurar facilmente uma idade máxima de 24 horas escolhendo "Depois:", inserindo "24" na caixa de texto e escolhendo "Horas" na caixa de combinação.

Seu primeiro parágrafo a respeito da entrada web.config está correto. Eu adicionaria o atributo cacheControlCustom para definir o cabeçalho de controle do cache como "público" ou o que for necessário nesse caso.

Você pode, é claro, conseguir o mesmo fornecendo entradas (ou arquivos) web.config conforme necessário.

Editar: removeu uma frase confusa :)

360Airwalk
fonte
1
A interface do usuário para esta configuração é terrível. Mas obrigado por explicar como chegar lá! +1
Billy Coover,
Essa interface cria um web.config com a mesma configuração que Jeff postou. Bom saber! Obrigado!
RandyMorris
2
Obrigado pelo post @ 360Airwalk. Você sabe como servir cabeçalhos diferentes Cache-Control( max-age) para tipos MIME ou extensões de arquivo diferentes?
Jasper
3
@Jasper: você pode configurá-lo por pasta, por exemplo. se você definir o controle de cache em uma pasta, as subpastas herdarão a configuração, mas você pode substituí-la novamente e assim por diante. você pode até mesmo fazer isso por arquivo. se você não conseguir acessar o console iis, também poderá fazê-lo via web.config. veja esta postagem para o último stackoverflow.com/questions/2195266/…
360Airwalk
27

Eu uso isso

<staticContent>
<clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="500.00:00:00" />
</staticContent>

para armazenar em cache conteúdo estático por 500 dias com cabeçalho de controle de cache público.

Elmer
fonte
10
A prática recomendada é de 1 ano, essencialmente 365 dias, no máximo.
Anicho de
5
500 dias é RUIM, esse artigo fala sobre uma regra RFC dizendo para não definir o cache para mais de 1 ano developers.google.com/speed/docs/best-practices/caching Não defina para mais de um ano no futuro , pois isso viola as diretrizes RFC.
foxontherock
@foxontherock de alguma forma você poderia substanciar a regra RFC de mais de 365 dias como uma prática ruim? Não consigo encontrar nada que sugira isso na documentação ...
Paesano2000
@Elmer Talvez você possa me ajudar. Olhe para isto: stackoverflow.com/questions/57990579/…
Success Man
19

O F5 Refresh tem a semântica de "recarregue o HTML atual E suas dependências diretas". Portanto, você deve esperar ver qualquer recurso imgs, css e js diretamente referenciado pelo HTML também sendo buscado novamente. É claro que 304 é uma resposta aceitável para isso, mas a atualização F5 implica que o navegador fará a solicitação em vez de depender de conteúdo de cache atualizado.

Em vez disso, tente simplesmente navegar para outro lugar e, em seguida, navegue de volta.

Você pode forçar a atualização, além de 304, segurando ctrl enquanto pressiona f5 na maioria dos navegadores.

AnthonyWJones
fonte
18

Complementando a resposta de Elmer, quando minha edição foi revertida.

Para armazenar conteúdo estático em cache por 365 dias com cabeçalho de controle de cache público , o IIS pode ser configurado com o seguinte

<staticContent>
    <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
</staticContent>

Isso se traduzirá em um cabeçalho como este:

Cache-Control: public,max-age=31536000

Observe que max-age é um delta em segundos, sendo expresso por um número inteiro positivo de 32 bits, conforme declarado nas Seções 14.9.3 e 14.9.4 do RFC 2616 . Isso representa um valor máximo de 2 ^ 31 ou 2.147.483.648 segundos (mais de 68 anos). Porém, para melhor garantir a compatibilidade entre clientes e servidores, adotamos o máximo recomendado de 365 dias (um ano).

Conforme mencionado em outras respostas, você pode usar essas diretivas também no web.config do seu site para todo o conteúdo estático. Como alternativa, você pode usá-lo apenas para conteúdos em um local específico também (na amostra, 30 dias de cache público para conteúdos na pasta "cdn"):

<location path="cdn">
   <system.webServer>
        <staticContent>
             <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00"/>
        </staticContent>
   </system.webServer>
</location>
Luciano Carvalho
fonte
Luciano, estou tentando armazenar minhas imagens em cache usando o seu método. Agora, quando analiso usando HttpFox, vejo 2 solicitações feitas para cada imagem. 1. O primeiro fornece um resultado anulado com o erro (NS_BINDING_ABORTED) 2. O segundo pedido é uma imagem em cache. Alguma ideia?
Mithil
1

há uma maneira fácil: 1. usando o web.config do site 2. na seção "staticContent" remova o fileExtension específico e adicione mimeMap 3. adicione "clientCache"

<configuration>
  <system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    <staticContent>
      <remove fileExtension=".ipa" />
      <remove fileExtension=".apk" />
      <mimeMap fileExtension=".ipa" mimeType="application/iphone" />
      <mimeMap fileExtension=".apk" mimeType="application/vnd.android.package-archive" />
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="777.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>
user1401317
fonte