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

标签 php wordpress caching apc

我正在使用 APC 模块使用 W3 Total 缓存插件设置页面缓存。 问题是,自从我启用了页面缓存 cookie 后,我在主题 header 中设置的 cookie 停止设置,同时读取现有 cookie 并按其值重定向也停止工作。

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

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

我检查了 .htaccess 文件,那里没有设置页面缓存,所以我认为使用 PHP 应该可以解决这个问题。

我不想禁用页面缓存并失去它提供的服务器响应时间重大改进。

有什么办法可以解决这个问题吗?

最佳答案

这很可能是清漆问题。当您访问 WP 网站的后端时,您可能希望禁用它缓存您的 cookie,并在修改您的主题后清除 Varnish 的缓存,以便它缓存您网站的新“ View ”。

我之前使用过您的 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 block ,以便 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'
    }
}

关于php - 绕过 W3 Total Cache 创建的页面缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27423528/

相关文章:

php - 用 <p> 标签和类替换标题 (<h1>, <h2> ...) 标签

css - 响应式菜单不会正确粘贴

php - 多个站点上的 APC 用户缓存 key 冲突

php - Prototype.js 干扰 Javascript

php - 什么是自动加载;如何使用 spl_autoload、__autoload 和 spl_autoload_register?

wordpress - 分析 VPS 性能(运行 WordPress 博客的 VPS)的好工具吗?

ruby-on-rails - 检测 Action 是否缓存在 Rails 中的可能方法?

javascript - 当某些字段为空时阻止表单提交

php - 将日期转换为 unixtime php

Java 内存感知缓存