如何在Apache上使用WordPress控制Cache-Control头?

4
这让我非常烦恼。我们在Apache上运行Wordpress(如果不明显的话,我们是新手)。具体来说,这是一个Bitnami AMI。由于我们几乎100%使用AWS,我想在Wordpress站点之前使用Cloudfront动态内容缓存。我已经阅读了大量关于如何使用W3 Total Cache(或类似工具)使其正常工作的文档/帖子。但我真正想做的只是掌握Cache-Control标头,以便我可以让Cloudfront按照预期的方式工作。
目前,我已修改了functions.php以包含代码(基于这里的另一篇帖子),该代码应修改标头。
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

第一个标题是我的。第二个标题来自堆栈中某个我似乎找不到/配置的位置。我在整个WordPress目录中搜索了任何我能想到的字符串,以帮助我找到执行此操作的代码。
我还尝试更改add_action调用中的“hook”为许多值,从“send_headers”逐步工作。唯一的结果是两个缓存控制标头的顺序发生变化。到目前为止,我无法删除/覆盖“max-age = 0,no-cache”的值。
我还尝试修改.htaccess、特定于Bitnami的htaccess.conf文件等等。
编辑:阅读here后,似乎第二个标题必须在WordPress/PHP内部引起。该文档表明,“处理程序”(在这种情况下为PHP)对响应处理有最后一个话语权。一旦该阶段完成,就只剩下向客户端发送响应和记录。

编辑2: 我在网站根目录下添加了一个foo.php文件。它没有调用任何Wordpress函数。但两个Cache-Control头部仍然出现。以下是该文件的全部内容。

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

3

看起来Bitnami Wiki页面已经迁移到https://docs.bitnami.com/virtual-machine/components/pagespeed/。 - Mark Berry
即使没有ModPagespeedModifyCachingHeaders指令,我在Chrome中仍然看到由Apache 2.4.25和Bitnami WordPress堆栈提供的Cache-Control和Expires头。这可能是由于此处描述的错误:https://serverfault.com/a/804199/166311。 - Mark Berry

0
答案是重新开始。我建立了一个全新的AWS Linux实例,并自己安装了Apache、MySql、PHP和Wordpress。我在.htaccess中使用了自己的配置来根据文件类型设置Cache-Control头。我安装了mod_pagespeed来帮助无能的内容作者上传巨大的图片。然后我浪费了很多时间修复所有帖子中的图像URL。安装的唯一的Wordpress插件是导入/导出插件(这样我就可以从旧服务器获取所有内容)和一个“滑块”插件,允许用户在帖子中翻页查看图片。
现在我终于可以正确地在Wordpress前面使用Cloudfront了。如果你想做同样的事情,请自己省点心,跳过所有超级厉害的缓存插件。完全没有必要。

0

我发布这个解决方案是因为当搜索“WordPress缓存控制头”时,这个页面会显示为最初的结果之一。

如果你在WordPress站点健康报告中看到你的站点没有使用缓存控制头,那么你可以修改WordPress生成的头部,或者缺乏头部。截至本文写作时,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”值或更详细地确定哪些请求路径(首页 vs. 文章页面)进行缓存以及缓存时间来改进解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接