Estou tentando usar o cache de página do Nginx em vez do cache do Wordpress. O cache parece funcionar bem, mas estou tendo problemas para definir cabeçalhos de cache condicionais com base em uma variável - se um usuário está conectado ao wordpress. Se um usuário estiver conectado, quero cabeçalhos sem cache aplicados; caso contrário, a página pode ser armazenada em cache por um dia pelo Wordpress e pelo CDN. Estou descobrindo que só posso adicionar um cabeçalho dentro de uma instrução if.
Eu li (mas não entendi totalmente, porque é tarde aqui) [se é mau] [1]. Também encontrei uma resposta na troca de pilha (no meu laptop, não consigo encontrá-la agora) que dizia que dentro de um bloco if apenas um add_header funciona.
Alguém pode me dar ideias para uma alternativa que pode funcionar melhor? Sei que posso combinar expirações com o controle de cache, mas quero mais cabeçalhos lá, além de entender e aprender.
Aqui está uma configuração significativamente simplificada com as partes relevantes no lugar.
server {
server_name example.com;
set $skip_cache 0;
# POST requests and urls with a query string should always go to PHP
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}
# Don't cache uris containing the following segments.
if ($request_uri ~* "/wp-admin/|/admin-*|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
set $skip_cache 1;
}
# Don't use the cache for logged in users or recent commenters
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
location / {
try_files $uri $uri/ /blog/index.php?args;
}
location ~ \.(hh|php)$ {
fastcgi_keep_conn on;
fastcgi_intercept_errors on;
fastcgi_pass php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# Cache Stuff
fastcgi_cache CACHE_NAME;
fastcgi_cache_valid 200 1440m;
add_header X-Cache $upstream_cache_status;
fastcgi_cache_methods GET HEAD;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header Z_ABCD "Test header";
if ($skip_cache = 1) {
add_header Cache-Control "private, no-cache, no-store";
add_header CACHE_STATUS "CACHE NOT USED";
}
if ($skip_cache = 0) {
add_header Cache-Control "public, s-maxage = 240";
expires 1d;
add_header CACHE_STATUS "USED CACHE";
}
add_header ANOTHER_HEADER "message";
}
}
Uma alternativa à
if
diretiva é amap
diretiva. E assumindo que oCACHE_STATUS
vsCACHE_STATIC
é apenas um erro de digitação na sua pergunta, você pode tentar isso:As
map
diretivas devem ser colocadas dentro dohttp
container (no mesmo nível doserver
bloco) conforme mostrado acima.A
map
diretiva está documentada aqui .Eu mesmo criei uma solução, com base na resposta que @Richard Smith forneceu que não fazia exatamente o que eu precisava. Em vez disso, usei o cabeçalho more cache-control e descartei a diretiva expires desnecessária.
Isso fica dentro do bloco do servidor
Então isso vai dentro de cada bloco de localização aplicável
Isso significa que nenhum "se" é necessário dentro do bloco de localização. Acho que isso resolve o problema, mas ainda estou interessado se alguém tiver ideias alternativas.