A diretiva if
no Nginx é processada no início do estágio de reescrita e, portanto, a variável $sent_http_content_type
ainda não foi inicializada - consulte este relatório de bug nginx para detalhes.
EDIT : Comparando nomes de usuário, esse relatório de bug pode ser você, na verdade! (^ _ ^)
Da mesma forma, a diretiva expires
parece não suportar variáveis da mesma forma que, por exemplo, add_header
. Então, como você não está em posição de especificar estaticamente o local com base nas extensões de arquivo, só consigo pensar em duas abordagens básicas.
Um seria usar a abordagem map
e add_header
sugerida por Vadim acima para definir manualmente cabeçalhos HTTP em vez de permitir que a diretiva expires
faça isso. Isso é um pouco menos flexível, pois não definirá o Expires
do cabeçalho, mas espero que qualquer navegador nos dias atuais faça a coisa certa com apenas Cache-Control
sendo definido. Aqui está um exemplo que testei brevemente:
map $sent_http_content_type $cacheable_types {
"text/css" "max-age=864000";
"image/jpeg" "max-age=864000";
default "";
}
# ...
server {
# ...
location / {
# ...
add_header "Cache-Control" $cacheable_types;
}
}
O valor 864000 é de 10 dias em segundos - você terá que alterar isso para o que desejar. A vantagem dessa abordagem é que você pode especificar diferentes tempos para cada tipo de arquivo e até mesmo sobrepor outros aspectos do cabeçalho Cache-Control
- sua discussão sobre esse cabeçalho aqui , e a parte oficial do HTTP RFC aqui se você preferir algo mais formal.
A segunda abordagem seria apenas organizar que as solicitações que resultarão em conteúdo armazenável em cache entrem em um caminho específico que você possa usar em uma diretiva location
da seguinte forma:
location / {
# ...
location /static {
expires 10d;
}
}
Isso facilita a configuração do nginx porque você pode usar sua diretiva expires
integrada, mas se é uma opção depende muito se você pode impor esse padrão de URLs em seu código.