Nginx, wordpress: Não é possível armazenar em cache de proxy reverso devido ao Set-Cookie. Recomendação para uma boa estratégia

1

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 ?

    
por Quintin Par 21.11.2012 / 06:18

0 respostas