【问题标题】:Bypass page cache created by W3 Total Cache绕过 W3 Total Cache 创建的页面缓存
【发布时间】:2015-02-09 23:26:41
【问题描述】:

我正在使用 APC 模块使用 W3 Total cache 插件设置页面缓存。 问题是,由于我启用了我在主题标题中设置的页面缓存 cookie,因此不再设置,读取现有 cookie 并按其值重定向也停止工作。

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

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

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

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

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

【问题讨论】:

    标签: php wordpress caching apc


    【解决方案1】:

    我在您的帖子中阅读了“Varnish”并对此有一点经验(尽管仅来自 Drupal 项目,而不是 WP)。 Varnish 我是一个提供匿名数据的反向代理。 Cookies 不是匿名的。这本身不是问题吗?

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

    当我需要快速的 WP 站点时,我使用 hhvm + nginx,也许这是你的替代方案。

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

    【讨论】:

    • 我开始猜测是 Varnish 导致了这个问题,尽管它是在我使用 APC 模块设置页面缓存后开始的。事实上,这不是一个答案,而是一个好兆头,可以帮助我更好地调查这个问题,谢谢。
    • 太棒了。也许解决这个问题的 PHP 解决方案是在您需要 setcookie(...) 时发送一个无缓存 http 标头 header("Cache-Control: no-cache, must-revalidate");。另一方面,这可能会严重损害性能。 gl hf :)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2020-07-30
      • 2016-04-03
      • 2018-12-07
      • 2018-08-29
      • 2023-03-21
      • 2012-02-09
      • 2013-03-14
      • 2018-01-31
      相关资源
      最近更新 更多