Objetivo de configuração do Nginx:
- Verifique se um determinado cookie existe (não importa qual seja o valor)
- Se não existir, inclua uma importação de configuração específica.
- Eu só quero aplicar minhas regras a determinados locais, não posso aplicar essas condicionais às configurações globais do nginx. É local específico.
ATUALMENTE, a configuração se parece com isso e está funcionando bem:
location ~ ^/somedestination\.php(/|$) {
<... truncated other config lines for readability ...>
include includes/xx-cache-config.conf;
<... truncated other config lines for readability ...>
fastcgi_pass php-fpm:9000;
}
Este servidor tem muitos blocos de localização e cada um import
tem suas próprias configurações de cache. Este é um aplicativo somente cgi, não há try_files diretos aqui.
Então, para atender aos objetivos acima, estou experimentando algo assim, verificando a existência de $cookie_user
variável e aplicando minha configuração apenas se o cooke não existir:
location ~ ^/somedestination\.php(/|$) {
# only include cache config if the cookie is null/empty
if ($cookie_user = false) {
include includes/xx-cache-config.conf;
}
fastcgi_pass php-fpm:9000;
}
Parece lógico, mas aqui está o problema: eu tropecei nisso: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
PERGUNTA: Se não devemos usar if
em um contexto de localização (de acordo com os documentos oficiais do nginx), como devo fazer isso?
EDIT: Aqui está o conteúdo do que está sendo incluído na cláusula condicional. Atualmente o nginx está SEMPRE incluindo esta configuração, meu objetivo agora é às vezes não incluí-lo (quando o cookie existe).
Nota: a própria configuração de zona está incluída em outro lugar. Essa configuração incluída permite isso.
includes/xx-cache-config.conf
fastcgi_cache CACHE_TLRS;
fastcgi_cache_bypass $no_resource_cache;
fastcgi_no_cache $no_resource_cache;
fastcgi_cache_valid 200 301 48h;
fastcgi_cache_valid 302 4h;
fastcgi_cache_revalidate on;
fastcgi_cache_use_stale http_500 http_503 timeout updating;
fastcgi_cache_lock on;
fastcgi_cache_lock_age 15s;
fastcgi_cache_lock_timeout 5s;
fastcgi_ignore_headers cache-control;
fastcgi_cache_key "$scheme$host$uri";
add_header X-Cache $upstream_cache_status;
Eu estava pensando demais nisso.
Depois de fazer algumas leituras, parece que as importações são avaliadas na inicialização do servidor, então você não pode colocá-las em uma condicional.
Então, acabei utilizando a
fastcgi_cache_bypass
diretriz, atingi o objetivo sem usarif
de jeito nenhum.Modificou a linha existente
fastcgi_cache_bypass $no_resource_cache;
Mudou para:
fastcgi_cache_bypass $cookie_user $no_resource_cache;
Isso ignorará o cache se as variáveis não estiverem vazias e não forem "0"
Link do documento: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_bypass