Я пытаюсь сделать обратное кэширование прокси для блога 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
?