Armazenamento em cache do Apache com base no cookie

3

Estou tentando colocar o mod_cache na frente do meu servidor de aplicativos para armazenar em cache solicitações "públicas", mas não solicitações de usuários que efetuaram login. Por várias razões, usar subdomínios ou caminhos alternativos não é uma opção viável para mim. Eu tenho o básico configurado como:

# Expiry and cache-control
SetEnvIf Cookie "NOCACHE" no-cache
Header set Cache-Control "no-cache" env=no-cache
RequestHeader set X-FW-NoCache "on" env=no-cache
ExpiresActive On
ExpiresDefault "access plus 1 days"
#ExpiresByType text/html "now"
CacheEnable disk /
CacheRoot /var/cache/apache
CacheIgnoreHeaders Set-Cookie
#CacheIgnoreCacheControl on
#CacheIgnoreNoLastMod on
RewriteEngine On

# Search Engine Safe URL rewrite
# Redirect Coldfusion requests to index.cfm
# matches /file.mp4 but not /file:name.mp4 (ie; is a real file)
RewriteCond %{REQUEST_FILENAME} !/[^/:]+\.[^/:]{2,5}$
RewriteRule (.*) /index.cfm$1 [PT,L]

Portanto, se o Apache vir o cookie NOCACHE, ele sempre passará a solicitação para o servidor de aplicativos, mesmo se estiver no cache. Isso funciona principalmente, mas há um problema que está me causando algum sofrimento.

Se você visitar a página sem o cookie, você receberá uma versão em cache com uma data de expiração futura. Se você definir o cookie e voltar para essa página, a solicitação não será enviada porque o navegador tem sua própria cópia em cache com uma data de expiração futura.

Como faço para modificar isso para que o navegador sempre faça uma solicitação e o cache envie uma cópia em cache ou em 304 sem solicitar ao servidor de aplicativos que o reprocesse? Em outras palavras, como eu digo ao mem_cache para armazenar em cache o arquivo, mas não os proxies do cliente e do recebimento de dados?

Eu tentei usar ExpiresByType text/html "now" , mas o cache não armazenará nada em cache - mesmo quando CacheIgnoreCacheControl estiver ativado.

Eu também brinquei com CacheIgnoreNoLastMod , mas não tive sorte em encontrar uma solução.

    
por SpliFF 29.04.2011 / 08:33

1 resposta

3

Normalmente, você faria isso simplesmente definindo Expires = -1 , mas nesse caso isso desativa a camada de armazenamento em cache. O CacheIgnoreNoLastMod aparece para ignorar apenas os cabeçalhos no-cache e no-store e não expira. Eu tentaria usar o cabeçalho sem cache como:

Header merge Cache-Control no-cache env=CGI

com o CacheIgnoreNoLastMod (veja mod_headers para mais detalhes sobre como configurar cabeçalhos). A página Cabeçalhos w3 é um bom recurso para entender os cabeçalhos HTTP. Certifique-se de entender os cabeçalhos de controle de cache em particular, pois isso o ajudará a entender o que o sistema está fazendo e como fazê-lo fazer o que você quer.

Para fins de depuração, eu começaria com o mod_cache desativado e carregaria páginas usando o Chrome / Firefox para inspecionar os cabeçalhos HTTP para garantir que você está conseguindo o que deseja. Certifique-se de forçar o recarregamento da página ao recarregar (mude a tecla / ctrl, sempre esqueço qual).

    
por 29.04.2011 / 14:23