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

ippsafx7  于 2023-06-21  发布在  WordPress
关注(0)|答案(3)|浏览(150)

这简直要把我逼疯了我们在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”开始一直到“send_headers”。唯一的结果是两个缓存控制头改变了顺序。到目前为止,我无法删除/覆盖“max-age=0,no-cache”值。
我也尝试过修改.htaccess,Bitnami特有的htaccess.conf文件等等。

EDIT:阅读完here,第二个头应该是WordPress/PHP中的某个地方引起的。这篇文档让“处理程序”(在本例中是PHP)在响应处理方面拥有最终决定权。这个阶段完成后,只需要将响应发送到客户端并记录日志。
编辑2:我在站点根目录下添加了一个foo.php文件。它根本不调用任何WordPress函数。两个Cache-Control标头仍然显示。以下是文件的全部内容。

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

vmdwslir1#

Apache的mod_pagespeed是罪魁祸首。默认设置为Cache-Control: no-cache, max-age=0
您需要更新apache2/conf/pagespeed.conf以包括

ModPagespeedModifyCachingHeaders off

然后运行这个来重新启动Apache

$ cd installdir
$ ./ctlscript.sh restart apache

参考文献:

6ie5vjzr

6ie5vjzr2#

答案是重新开始。我构建了一个全新的AWS Linux示例,并自己安装了Apache,MySql,PHP和Wordpress。我在.htaccess中使用自己的配置来根据文件类型设置Cache-Control头。我安装了mod_pagespeed来帮助处理不称职的内容作者上传的巨型图像。然后我浪费了大量的时间来修复所有帖子中的图像URL。唯一安装的Wordpress插件是导入/导出插件(这样我就可以从旧服务器上获取所有内容)和一个“滑块”插件,允许用户在帖子中浏览图片。
现在我终于可以在WordPress面前正确使用Cloudfront了。如果你想做同样的事情,帮你自己一个忙,跳过所有的超级骗子,whiz-bang缓存插件。完全没必要。

7y4bm7vi

7y4bm7vi3#

我发布这个解决方案是因为这个页面显示为搜索“WordPress缓存控制头”时的第一个结果之一。
如果您在WordPress网站健康报告中看到您的网站没有使用缓存控制头,那么您可以修改WordPress生成的头,而不是更改Apache config或.htaccess。在撰写本文时,WordPress仅在管理 Jmeter 板中生成缓存控制头。缓存之外的数据应该由插件或自定义解决方案处理,如下所示。
以下解决方案将:
1.更改WordPress标题以启用客户端缓存控制
1.如果用户不在管理控制面板中。

  • 这已经用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”值或更细粒度地了解哪些请求路径(主页与发布页面)被缓存以及缓存多长时间来改进解决方案。

相关问题