Назад | Перейти на главную страницу

Nginx, wordpress: невозможно правильное кэширование обратного прокси из-за Set-Cookie. Рекомендация для хорошей стратегии

Я пытаюсь сделать обратное кэширование прокси для блога wordpress, и у меня возникают проблемы.

Первоначальной конфигурацией было простое обратное кэширование, подобное этому

  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;

Я быстро понял, что авторизованные пользователи будут отправлены на бросок, и я сделал

      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;

  }

Но это не сработало с тех пор, как Nginx 1.0+ не кэширует ответы с Set-Cookie. К моему удивлению, даже все обращения анонимных пользователей приводят к Set-Cookie. Пример ниже.

Теперь я не могу

proxy_ignore_headers  "Set-Cookie";
proxy_hide_header "Set-Cookie";

поскольку это также не будет передавать файлы cookie для зарегистрированных пользователей. Я сделал что-то вроде этого

      location ~* wp\-.*\.php|wp\-admin {
          proxy_pass http://wordpressapache;
      }

Но затем вошедшие в систему пользователи также вернутся на страницу блога, и их файлы cookie будут отклонены.

Другой способ - сделать что-то вроде этого через плагин и отправь 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');

Но тогда скрытый cookie создает проблемы. Удаление скрытого cookie также нарушает кеширование.

Что за хорошая стратегия кеширования страниц для анонимных пользователей с помощью Nginx которые могут быть аннулированы зарегистрированными пользователями. Возможно, используя proxy_cache_bypass?