簡體   English   中英

如何在 Apache 上使用 Wordpress 控制 Cache-Control header?

[英]How to I get control of the Cache-Control header with Wordpress on Apache?

這真讓我抓狂。 我們在 Apache 上運行 Wordpress(如果不是很明顯,我們是這個堆棧的新手)。 具體來說,這是一個 Bitnami AMI。 因為我們幾乎 100% 都在 AWS 上,所以我想在 Wordpress 站點前面使用 Cloudfront 動態內容緩存。 我已經閱讀了大量關於如何使用 W3 Total Cache(或類似的)來完成這項工作的文檔/帖子。 但我真正想做的是控制 Cache-Control header,這樣我就可以讓 Cloudfront 按預期方式工作。

目前,我修改了 functions.php 以包含應該修改 header 的代碼(基於此處的另一篇文章)。

function varnish_safe_http_headers() {
    session_cache_limiter('');
    header_remove("Cache-Control");
    header("Cache-Control: public, max-age=60");
  if( !session_id() )
  {
    session_start();
  }
}
add_action( 'template_redirect', 'varnish_safe_http_headers' );

不幸的是,我得到的是兩個標題。

Cache-Control:public, max-age=60
Cache-Control:max-age=0, no-cache

第一個header是我的。 第二個 header 來自堆棧中我似乎無法找到/配置的其他位置。 我已經搜索了 Wordpress 目錄的全部內容,尋找我能想到的任何字符串,這些字符串可以幫助我找到執行此操作的代碼。

我還嘗試將 add_action 調用中的“掛鈎”更改為任意數量的值,從“send_headers”開始一直進行下去。 唯一的結果是兩個緩存控制標頭改變了順序。 到目前為止,我無法刪除/覆蓋“max-age=0, no-cache”值。

我還嘗試修改 .htaccess、Bitnami-specific.htaccess.conf 文件等。

編輯:閱讀此處后,似乎第二個 header 一定是由 Wordpress/PHP 中的某處引起的。 該文檔使“處理程序”(在本例中為 PHP)看起來對響應處理有最終決定權。 一旦該階段完成,就只會向客戶端發送響應並進行日志記錄。

編輯 2 :我在站點的根目錄中添加了一個 foo.php 文件。 它根本不調用 Wordpress 函數。 兩個 Cache-Control 標頭仍然出現。 這是文件的全部內容。

<?php
header("Cache-Control: public, max-age=60");
?>

Apache 的 mod_pagespeed 是罪魁禍首。 它默認設置Cache-Control: no-cache, max-age=0

您需要更新apache2/conf/pagespeed.conf以包含

ModPagespeedModifyCachingHeaders off

然后運行它以重新啟動apache

$ cd installdir
$ ./ctlscript.sh restart apache

參考:

答案是重新開始。 我構建了一個全新的 AWS Linux 實例並自己安裝了 Apache、MySql、PHP 和 Wordpress。 我在 .htaccess 中使用了我自己的配置來根據文件類型設置 Cache-Control 標頭。 我安裝了 mod_pagespeed 來幫助處理由無能的內容作者上傳的巨幅圖像。 然后我浪費了大量時間來修復所有帖子中的圖片 URL。 唯一安裝的 Wordpress 插件是導入/導出插件(因此我可以從舊服務器獲取所有內容)和一個“滑塊”插件,允許用戶在帖子中翻閱圖像。

現在我終於可以在 Wordpress 面前正確使用 Cloudfront。 如果您也想做同樣的事情,請幫自己一個忙,跳過所有超級騙子高手緩存插件。 完全沒有必要。

我發布此解決方案是因為此頁面顯示為搜索“WordPress 緩存控制標頭”時的第一個結果之一。

如果您在 WordPress 站點健康報告中看到您的站點沒有使用緩存控制標頭,那么您可以修改 WordPress 生成的標頭,而不是更改 Apache 配置或 .htaccess,或者將其關閉。 在撰寫本文時,WordPress 僅在您位於管理儀表板時生成緩存控制標頭。 該緩存之外的內容應由插件或自定義解決方案處理,如下所示。

以下解決方案將:

  1. 更改 WordPress 標頭以啟用客戶端緩存控制
  2. 如果用戶不在管理儀表板中。
  • 這已通過 WordPress 6.2.2 測試
  • 您可以將它放在當前活動的主題“functions.php”文件中。
  • 適用於登錄用戶和匿名用戶。

if ( ! function_exists( 'mysite_client_cache' ) ) :
    function mysite_client_cache( $headers ) {
        global $wp;

        $current_request_path = $wp->requet;

        if ( '' !== $current_request_path ) {
            $current_request_path = trim( $current_request_path, '/' );

            if ( 'wp-admin' !== $current_request_path ) {
                $headers[ 'Cache-Control' ] = 'public, max-age=604800';
            }
        }

        return $headers;
}
endif;

add_filter( 'wp_headers', 'mysite_client_cache', 100, 1);

這適用於不經常更新的站點。 該解決方案可以通過降低“max-age”值或更細化哪些請求路徑(主頁與帖子頁面)被緩存以及緩存多長時間來改進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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