Eu recentemente troquei uma instância opencart de Apache + mod_php para nginx + fastcgi + php-fpm. Eu tenho tentado aproveitar o cache para a maioria das páginas através de fastcgi-cache.
Infelizmente, muitos usuários começaram a relatar pedidos fantasmas ou assumir outras contas (weeee !!!!) De escavações exaustivas, parece que as páginas foram armazenadas em cache com set-cookie! Assim, os usuários subseqüentes que não enviaram um cookie de sessão pré-existente estavam obtendo o cookie de sessão do iniciador de cache. Mau!
De acordo com toda a documentação existente, as seguintes configurações devem impedir que isso aconteça (pelo menos do meu entendimento):
fastcgi_pass_header Set-Cookie;
fastcgi_pass_header Cookie;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
Quando examinei os caches individuais, notei várias páginas com set-cookie: [somerandomsessionid] De acordo com a documentação do nginx em fastcgi_cache_valid ...
If the header includes the “Set-Cookie” field, such a response will not be cached.
Ao incluir Set-Cookie com fastcgi_ignore_headers, estou dizendo para armazenar o cookie em conjunto? Em muitos exemplos, o Set-Cookie faz parte dos argumentos para fastcgi_ignore_headers. Ou é para impedir que o Set-Cookie seja processado, embora esteja obviamente nos arquivos em cache?
Aqui estão as partes pertinentes da minha configuração:
localização ~ .php $ {...
fastcgi_next_upstream error timeout invalid_header http_500 http_503;
fastcgi_cache OPENCART;
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;
fastcgi_cache_purge $purge_method;
fastcgi_cache_methods GET HEAD;
fastcgi_cache_valid 200 5m;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_pass_header Set-Cookie;
#fastcgi_hide_header Set-Cookie;
fastcgi_pass_header Cookie;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
Minhas regras de desvio de cache (chamadas em /etc/conf.d) ...
################## Fast CGI Cache Settings
# if we find a PHP session cookie, let's cache it's contents
map $http_cookie $php_session_cookie {
default "";
~PHPSESSID=(?<sessionkey>[a-zA-Z0-9]+) $sessionkey; # PHP session cookie
}
fastcgi_cache_path /var/nginx/cache levels=1:2 keys_zone=OPENCART:5m max_size=10000m inactive=15m;
fastcgi_cache_key "$scheme$request_method$host$request_uri$is_mobile$php_session_cookie";
map $request_method $purge_method {
PURGE 1;
default 0;
}
################## Cache Header
add_header X-Cache $upstream_cache_status;
################## Cache Bypass Maps
#Don't cache the following URLs
map $request_uri $no_cache_uri {
default 0;
~*/admin/ 1;
~*/dl/ 1;
}
# ~*/music/mp3_[^/]+/[0-9]+/.+$ 1;
map $query_string $no_cache_query {
default 0;
~*route=module/cart$ 1;
~*route=account/ 1; #exclude account links
~*route=checkout/ 1; #exclude checkout links
~*route=module/founders 1;
~*route=module/cart 1;
~*route=product/product/captcha 1;
~*nocache=1 1; # exclude ajax blocks and provide for manual cache override
}
map $http_cookie $no_cache_cookie {
default 0;
}
map $http_x_requested_with $no_cache_ajax {
default 0;
XMLHttpRequest 1; # Don't cache AJAX
}
map $sent_http_x_no_cache $no_no_cache {
default 0;
on 1; # Don't cache generic header when present and set to "on"
}
## Combine all results to get the cache bypass mapping.
map $no_cache_uri$no_cache_query$no_cache_cookie$no_cache_ajax$no_no_cache $no_cache {
default 1;
00000 0;
}
Configuração da sessão no php.ini
session.auto_start = 1
session.cache_expire = 180
session.cache_limiter = nocache
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_secure = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 3600
session.gc_probability = 0
session.hash_function = "sha256"
session.name = PHPSESSID
session.serialize_handler = php
session.use_cookies = 1
session.use_only_cookies = 1
session.use_strict_mode = 1
session.use_trans_sid = 0
Opencart usando session_start () em cada carregamento de página, então ignorando a sessão php não me faz bem na maior parte. Se houvesse uma maneira de impedir que os cabeçalhos do Set-Cookie terminassem no cache, isso provavelmente funcionaria para mim.
Alguém pode me apontar na direção certa?