簡體   English   中英

W3 Total Cache創建的繞過頁面緩存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM