Defina a política de armazenamento em cache para solicitação reescrita

1

Eu tenho um RewriteRule que reescreve qualquer pedido de um arquivo contendo uma parte de versão para o arquivo sem a versão:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.[0-9a-f]{32}(\.[0-9a-z]{2,6})$ $1$2 [L]

Isso significa que sempre que o arquivo styles.<version-id>.css for solicitado, ele será reescrito em styles.css . Agora, como posso definir os cabeçalhos de cache para que um arquivo seja armazenado em cache por um período mais longo se a versão com versão do arquivo for solicitada?

Em outras palavras, se o arquivo styles.css for requerido, ele deverá ser armazenado em cache por 24 horas, enquanto o arquivo styles.<version-id>.css deverá ser armazenado em cache por 365 dias.

Eu tentei definir o cache usando FilesMatch antes e depois da reescrita usando este snippet:

<FilesMatch ".+\.[0-9a-f]{32}\.[0-9a-z]{2,6}">
   Header set Cache-Control "max-age=31536000, public"
</FilesMatch>

Mas isso não funciona. Talvez não corresponda porque o nome do arquivo é reescrito. Não sei.

Eu também tentei usar variáveis de ambiente:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.[0-9a-f]{32}(\.[0-9a-z]{2,6})$ $1$2 [L,E=AutoVersion]

Header set Cache-Control "max-age=31536000, public" env=AutoVersion

Mas também não consigo fazer isso funcionar.

Existe alguma maneira de definir a política de cache de uma solicitação reescrita com base na solicitação original?

    
por Magnar Myrtveit 21.08.2017 / 18:06

1 resposta

0

<FilesMatch> corresponde a arquivos físicos (não URLs), portanto, isso nunca corresponderá a uma URL do formulário styles.<version-id>.css , em que o arquivo físico é styles.css .

<LocationMatch> (na configuração do servidor) é o equivalente para URLs, mas você está reescrevendo o URL e% wrappers% co_de são aplicados atrasados, então, novamente, isso nunca corresponderá.

(Com base no formato e no comportamento dessas diretivas, presumo que essas diretivas estejam em um diretório / <Location[Match]> context, em oposição a diretamente no servidor de configuração / host virtual?)

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.[0-9a-f]{32}(\.[0-9a-z]{2,6})$ $1$2 [L,E=AutoVersion]

Header set Cache-Control "max-age=31536000, public" env=AutoVersion

Mas você pode fazer isso com a ajuda do mod_rewrite para definir uma variável de ambiente - como você fez. Isso teria funcionado praticamente como está se usado diretamente na configuração do servidor. (Exceto que .htaccess precisaria mudar para REQUEST_FILENAME para funcionar como pretendido, caso contrário, a diretiva LA-U:REQUEST_FILENAME iria sempre avaliar true.)

No entanto, em um contexto por diretório, o processo de regravação inicia novamente após a reconfiguração inicial e as variáveis de ambiente são prefixadas com RewriteCond (a variável de ambiente original não é retida). Assim, você só precisa alterar sua diretiva REDIRECT_ para verificar essa variável de ambiente renomeada . Por exemplo:

Header set Cache-Control "max-age=31536000, public" env=REDIRECT_AutoVersion
    
por 21.08.2017 / 21:36