[英]Bypass page cache created by W3 Total Cache
我正在使用APC模塊使用W3 Total緩存插件設置頁面緩存。 問題是,由於啟用了頁面緩存cookie,因此我在主題標題中設置的頁面停止設置,同時讀取現有cookie並通過其值重定向也停止工作。
我幾乎100%確信是由頁面緩存引起的,而且在W3TC頁面緩存之前,我無法找到合適的編程解決方案來攔截頁面緩存並設置所需的Cookie。 簡單的調試也顯示了正在讀取PHP腳本,但setCookie沒有設置cookie。 此外,通過wordpress admin清除頁面緩存並清除清漆緩存允許設置Cookie,盡管只有一次,因為對頁面的其余調用將被緩存(304響應)。
我已咨詢過PHP手冊中有關setcookie的內容 ,並確保將cookie設置在任何HTML /空白之前
我已經檢查了.htaccess文件,並且那里沒有設置頁面緩存,所以我認為應該可以使用PHP克服此問題。
我不想禁用頁面緩存並失去它所提供的服務器響應時間的重大改進。
任何想法如何克服這個問題?
我在您的帖子中讀了“ Varnish”,對此有一點經驗(盡管僅來自Drupal項目,而非WP)。 提供匿名數據的Varnish ia反向代理。 Cookies不是匿名的。 這本身不是問題嗎?
也許您可以將Varnish配置為忽略使用特定cookie緩存的頁面,但這可能無助於加快網頁的速度。
當我需要快速的WP站點時,我可以使用hhvm + nginx,也許這是您的替代選擇。
而且,是的,我知道這不是您問題的答案,但是我不確定在給定服務器設置的情況下您在帖子中指出的PHP解決方案。 我希望你能原諒我。
這很可能是清漆問題。 當您訪問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'
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.