Eu estou tentando fazer cache de proxy reverso para um blog wordpress e estou com problemas.
A configuração inicial era um armazenamento em cache reverso simples como este
location / {
proxy_cache_key "$scheme://$host$request_uri";
proxy_cache staticfilecache;
proxy_pass http://wordpressapache;
add_header Cache-Control public;
proxy_cache_valid 200 302 10d;
Eu percebi rapidamente que os usuários logados serão enviados para um lance com e por isso eu fiz
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Accept-Encoding "";
location / {
# If logged in, don't cache.
if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
set $do_not_cache 1;
}
proxy_cache_key "$scheme://$host$request_uri $do_not_cache";
proxy_cache staticfilecache;
proxy_pass http://wordpressapache;
add_header Cache-Control public;
proxy_cache_valid 200 302 10d;
}
Mas isso não funcionou, pois o Nginx 1.0+ não armazena em cache respostas que tenham Set-Cookie . Para minha surpresa, até mesmo todos os acessos de usuários anônimos resultam em Set-Cookie
. Um exemplo abaixo.
Agoraeunãopossofazerum
proxy_ignore_headers"Set-Cookie";
proxy_hide_header "Set-Cookie";
pois isso também não passará cookies para usuários logados. Eu fiz algo parecido com isso
location ~* wp\-.*\.php|wp\-admin {
proxy_pass http://wordpressapache;
}
Mas os usuários conectados também voltarão à página do blog e seus cookies serão rejeitados.
Uma outra maneira é fazer algo assim através do plugin e enviar X-Accel-Expires.
function add_xaccel_header() {
# Set the X-Accel-Expires header to never cache the page if it looks like the page needs to be tailored for a user.
$user_cookie_there = false;
foreach($_COOKIE as $key => $value){
if( preg_match('/wordpress_(?!test_cookie)|comment_author|wp-postpass/', $key) ){
$user_cookie_there = true;
}
}
if($user_cookie_there){
header("X-Accel-Expires: 0");
}
}
add_action('init','add_xaccel_header');
Mas o cookie de ocultação está criando problemas. Remover o cookie hide também quebra o cache.
O que é uma boa estratégia para armazenar páginas em cache para usuários anônimos usando Nginx que podem ser invalidados por usuários conectados. Talvez usando proxy_cache_bypass
?