繁体   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