Cloudflare 设置了网站缓存规则,但是依旧返回 pragma no-cache HTTP 头

文章目录

    例如在 Cloudflare 的页面缓存规则中,设置了 3 天,但是返回的网页 HTTP 头是:

    Cloudflare 页面返回

    • age 73132
    • alt-svc h3=“:443”; ma=86400
    • cache-control max-age=7200
    • cf-cache-status HIT
    • cf-ray a29e93ee2b8ca094-FRA
    • content-type text/html; charset=utf-8
    • date Wed, 12 Aug 2026 09:50:48 GMT
    • expect-ct max-age=86400, enforce
    • expires Wed, 17 Aug 2005 00:00:00 GMT
    • last-modified Tue, 11 Aug 2026 13:14:29 GMT
    • pragma no-cache

    pragma no-cache 代表什么

    pragma: no-cache 代表这是一个 HTTP/1.0 协议的遗留指令,其作用是要求缓存服务器在返回内容前,必须向源服务器进行验证(即强制回源验证)。

    但在当前的场景中,它基本不起作用,可以忽略。因为现代浏览器和 Cloudflare 优先遵循 HTTP/1.1 的 Cache-Control 头。

    现代标准以 Cache-Control 为准。如果同时存在,客户端会忽略 Pragma。

    3 天 VS 2 小时

    cache-control: max-age=7200(源站要求缓存 2 小时)

    age: 73132(当前资源已在 Cloudflare 缓存中存了 73132 秒 ≈ 20.3 小时)

    age 远大于 max-age,这证明了 Cloudflare 的“边缘缓存 TTL”(设置的 3 天/259200 秒)成功覆盖(覆盖/忽略)了源站的 max-age=7200。缓存规则已经完全生效,Cloudflare 强制将这个页面保留了将近一天,并且还会继续保留到 3 天期满。

    Joomla 配置

    pragma: no-cache 常由 Joomla 的系统缓存设置产生。关闭它可能从源头解决问题。

    • 登录 Joomla 管理员后台。
    • 进入 系统 (System) -> 全局配置 (Global Configuration)。
    • 点击 系统 (System) 选项卡。
    • 将 系统缓存 (System Cache) 设置为 “关闭 - 不缓存” (OFF - Don’t cache)。
    • 保存设置并清除 Joomla 缓存。

    Joomla 修改源码

    如果没有权限修改 Joomla 后台配置,可以在服务器上直接修改源码:

    libraries/vendor/joomla/application/src/AbstractWebApplication.php

    搜索 no-cache 并注释掉:

     if (!$this->allowCache()) {
        // Expires in the past.
        $this->setHeader('Expires', 'Wed, 17 Aug 2005 00:00:00 GMT', true);
    
        // Always modified.
        $this->setHeader('Last-Modified', \gmdate('D, d M Y H:i:s') . ' GMT', true);
        $this->setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', false);
    
        // HTTP 1.0
        $this->setHeader('Pragma', 'no-cache');
    }
    

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式