Configurando diferentes cabeçalhos de caching para redirecionamentos diferentes usando o Apache mod_rewrite

2

Eu tenho um vhost Apache que realiza várias operações de reescrita (usando mod_rewrite) nas URLs solicitadas. Algumas dessas chamadas RewriteRule redirecionam o navegador para outros hosts (usando redirecionamentos 301 e 302).

Eu defini uma expiração padrão de 1 segundo nesse arquivo vhost:

ExpiresActive On
ExpiresDefault "access plus 1 second"

e, consequentemente, todos os redirecionamentos incluem esse cabeçalho:

Cache-Control: max-age=1

Agora, o que estou tentando fazer é gerar um cabeçalho de cache diferente no caso de um redirecionamento específico. Eu quero que a maioria dos redirecionamentos (os 302s) continuem com uma expiração de 1 segundo, mas para um deles (um 301), eu gostaria de usar uma expiração de 1 dia.

Isso é factível?

    
por Francois Marier 05.09.2011 / 07:52

5 respostas

4

Existe uma maneira de fazer isso, mas não com mod_expires. Em vez disso, você deve definir uma variável de ambiente usando mod_rewrite e, em seguida, adicionar condicionalmente os cabeçalhos de cache corretos com mod_headers, conforme descrito em Mark S. Kolich: Defina o Cache-Control e expira cabeçalhos em um redirecionamento com mod_rewrite .

Então, minha solução final é assim:

RewriteRule ... [last,redirect=301,env=longexpiry:1]
RewriteRule ... [last,redirect=302,env=nocache:1]

Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache
Header always set Cache-Control "max-age=86400" env=longexpiry

Certifique-se de que você não tem um conjunto de expiração padrão por mod_expires, ou você terá cabeçalhos duplicados.

    
por 10.09.2011 / 04:34
1

Expandindo a resposta de @Francois Marier, precisei de uma regra de regravação semelhante a essa sem o redirecionamento de 30X:

RewriteRule ^version/[0-9a-z\-]*/(.*)$ /foo/$1 [E=versioncache:1]

E como eu queria usar versioncache em uma regra Header set , ele precisa ser:

Header always set Cache-Control "max-age=86400" env=REWRITE_versioncache

Por quanto tempo você pensa em mim para descobrir por que o óbvio ... env=versioncache não funcionou? Graças a esta resposta para a dica sobre apache precedendo REWRITE_ .

    
por 16.10.2014 / 13:34
0

Para isso, você precisa criar outro host virtual com configurações diferentes e, para os redirecionamentos desejados em "esta situação", use o vHost. Isto não é código PHP, é a linguagem Apache. Desculpa. Não há if-thens.

    
por 05.09.2011 / 09:05
0

Você pode tentar usar a diretiva SetEnvIf do Apache mod_setenvif . Algo parecido com isto (não testado):

SetEnvIf Request_URI \.gif EXPIRES1DAY
Header set Cache-Control max-age=86400 env=EXPIRES1DAY
    
por 05.09.2011 / 16:31
0

Uma maneira de resolver esse problema sem remover seu conjunto de expiração padrão por mod_expires é adicionar um bloco <Location> para o URL que está sendo redirecionado. Digamos que você esteja redirecionando para uma pasta com versão e altere periodicamente essa versão:

RewriteRule ^/approot/(.*)  /approot.1.2.3.4/$1 [R=307,L]

Se você não deseja que o redirecionamento seja armazenado em cache (mas deseja que o conteúdo real seja armazenado em cache), basta adicionar esse bloco à sua configuração:

<Location /approot>
    ExpiresActive Off
</Location>

É claro que " /approot " representa qualquer URL que você esteja redirecionando.

Simples e fácil. Você não precisa mexer na sua configuração de mod_expires já em funcionamento. Você não precisa adicionar ou remover cabeçalhos com mod_headers. Você acabou de dizer ao mod_expires para não adicionar seus cabeçalhos para o URL que você está redirecionando.

Primeiro tentei a resposta aceita acima (por François Marier), mas não funcionou porque eu não queria desabilitar minha configuração de ExpiresDefault e depois ter que replicar uma expiração em muitas áreas diferentes da configuração em seu lugar.

    
por 27.08.2014 / 18:48