我使用APC模块使用W3 Total cache plugin设置页面缓存。 事情就是,因为我已经启用了我在主题标题中设置的页面缓存cookie停止设置,也读取现有的cookie并重定向它的值也停止了。
我几乎100%确定它是导致它的页面缓存,我无法在W3TC页面之前找到拦截页面缓存并设置所需Cookie的正确编程解决方案缓存。 此外,简单的调试显示正在读取PHP脚本但setCookie未设置cookie。 此外,通过wordpress admin清除页面缓存并清除varnish缓存允许设置cookie,但只允许一次,因为对页面的其余调用将被缓存(304响应)。
我已经查阅了关于setcookie的PHP手册,并确保我的cookie在任何HTML /空格之前设置
我已经检查了.htaccess文件,并且没有设置页面缓存,因此我应该假设使用PHP克服这个问题。
我不想禁用页面缓存,并且会失去服务器响应时间,从而为其提供重大改进。
任何想法如何克服这个问题?
答案 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'
}
}