绕过W3 Total Cache创建的页面缓存

时间:2014-12-11 13:00:53

标签: php wordpress caching apc

我使用APC模块使用W3 Total cache plugin设置页面缓存。 事情就是,因为我已经启用了我在主题标题中设置的页面缓存cookie停止设置,也读取现有的cookie并重定向它的值也停止了。

我几乎100%确定它是导致它的页面缓存,我无法在W3TC页面之前找到拦截页面缓存并设置所需Cookie的正确编程解决方案缓存。 此外,简单的调试显示正在读取PHP脚本但setCookie未设置cookie。 此外,通过wordpress admin清除页面缓存并清除varnish缓存允许设置cookie,但只允许一次,因为对页面的其余调用将被缓存(304响应)。

我已经查阅了关于setcookie的PHP手册,并确保我的cookie在任何HTML /空格之前设置

我已经检查了.htaccess文件,并且没有设置页面缓存,因此我应该假设使用PHP克服这个问题。

我不想禁用页面缓存,并且会失去服务器响应时间,从而为其提供重大改进。

任何想法如何克服这个问题?

2 个答案:

答案 0 :(得分:2)

我在你的帖子中读到了“Varnish”并且有一点经验(虽然只有Drupal项目,而不是WP)。 Varnish是一个提供匿名数据的反向代理。 Cookies不是匿名的。这本身不是问题吗?

也许您可以将Varnish配置为忽略使用特定cookie缓存的页面,但这可能无助于加快您的网页速度。

当我需要快速的WP网站时,我使用hhvm + nginx,这可能是你的另一种选择。

而且,是的,我知道这不是您的问题的答案,但我不确定是否有一个PHP解决方案,因为您在帖子中说明了服务器设置说明。我希望你能原谅我。

答案 1 :(得分:2)

这很可能是一个清漆问题。当您访问WP站点的后端时,您可能希望禁用它来缓存您的cookie,并在修改主题后清除Varnish的缓存,以便它将缓存新的"视图&# 34;你的网站。

之前我使用过您的W3TC + Varnish解决方案,需要一些修补才能做到正确。我使用Varnish for WP(配置的一部分)的提示可以引用(而不是复制):

sub vcl_recv {
    # Don't cache WordPress backend
    if (req.url ~ "wp-(login|admin|comments-post.php|cron.php)" || req.url ~ "preview=true" || req.url ~ "xmlrpc.php") {
        return (pass);
    }

    # Don't cache if WordPress cookie is present
    if (req.http.cookie) {
        if (req.http.cookie ~ "(wordpress_|wp-settings-)") {
            return(pass);
        } else {
            unset req.http.cookie;
        }
    }
}

sub vcl_fetch {
    # Don't cache WordPress backend
    if (req.url ~ "wp-(login|admin|comments-post.php|cron.php)" || req.url ~ "preview=true" || req.url ~ "xmlrpc.php") {
        set beresp.http.magicmarker = "1";
        return (hit_for_pass);
    }
    if ( (!(req.url ~ "(wp-(login|admin|comments-post.php|cron.php)|login)")) || (req.request == "GET") ) {
        unset beresp.http.set-cookie;
        set beresp.ttl = 4h;
    }
}

然后还添加一个PURGE块,以便W3TC可以在站点/主题更新后清除缓存(而不是手动执行)。

acl purge {
    # Only allow the server to issue PURGE requests
    "127.0.0.1";
    "localhost";
    "162.243.151.227";
}

sub vcl_hit {
    if (req.request == "PURGE") {
        purge;
        error 200 "HIT Purged.";
    }
}

sub vcl_miss {
    if (req.request == "PURGE") {
        purge;
        error 200 "MISS Purged.";
    }
}

sub vcl_recv {
    # PURGE requests
    if (req.request == "PURGE") {
        if (!client.ip ~ purge) {
            error 401 "Not allowed.";
        }
        # 3 ways to refresh the cache:
        # 1: force lookup
        # return (lookup);
        # 2: url purging: http://wordpress.stackexchange.com/questions/76037/make-w3-total-cache-empty-all-caches-function-purge-varnish
        # purge_url(req.url);
        # 3: ban to invalidate cache content
        ban("req.url ~ ^" + req.url + "$ && req.http.host == " + req.http.host);
        error 200 "RECV Purged.";
        # Observe with: varnishlog -I 'VCL_error'
    }
}