![Nginx、wordpress:由于 Set-Cookie 导致无法正确进行反向代理缓存。推荐一个好的策略](https://linux22.com/image/797049/Nginx%E3%80%81wordpress%EF%BC%9A%E7%94%B1%E4%BA%8E%20Set-Cookie%20%E5%AF%BC%E8%87%B4%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%BF%9B%E8%A1%8C%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E7%BC%93%E5%AD%98%E3%80%82%E6%8E%A8%E8%8D%90%E4%B8%80%E4%B8%AA%E5%A5%BD%E7%9A%84%E7%AD%96%E7%95%A5.png)
我正在尝试为 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
?