You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TYPO3扩展控制器:HTTP状态码与Header缓存问题求助

解决动态设置404状态码后缓存失效的问题

我来帮你搞定这个缓存状态码的坑!你遇到的问题本质是页面缓存系统没有把动态设置的404状态码和缓存条目绑定——首次清除缓存后请求时,状态码是404,但缓存系统只存了页面内容,后续请求直接返回缓存的内容,却用默认的200状态码响应。

最佳解决方案:抛出PageNotFoundException异常

不要手动设置状态码,而是让TYPO3的内置错误处理机制接管404场景,这样缓存系统会自动关联状态码和缓存条目,彻底解决后续请求状态码不对的问题。

修改你的控制器代码如下:

public function showAction(\My\Model\Name $model = null) {
    if (is_null($model)) {
        // 抛出TYPO3标准的404异常,带自定义错误码(可选)
        throw new \TYPO3\CMS\Core\Error\Http\PageNotFoundException(
            '请求的记录未找到', 
            1690001234 // 自定义错误码,方便排查问题
        );
    } else {
        $this->view->assign('model', $model);
    }
}

为什么这个方法有效?

  • TYPO3内核捕获到PageNotFoundException后,会自动设置正确的404状态码,同时通知缓存系统:这个请求的响应状态是404,缓存时要把状态码和内容一起存储。
  • 后续请求命中缓存时,会同时返回缓存的404内容和404状态码,不会再出现200的错误。
  • 你依然可以通过Fluid模板的条件判断展示专属的“未找到”提示,或者通过TYPO3的错误页面配置统一管理404页面样式。

如果你坚持手动设置状态码(不推荐)

如果因为特殊需求必须手动设置状态码,需要强制缓存系统不缓存这个响应,或者将状态码纳入缓存标识:

public function showAction(\My\Model\Name $model = null) {
    if (is_null($model)) {
        $this->response->setStatus(404);
        // 禁止缓存这个响应,避免后续请求返回错误状态码
        $this->response->setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
        $this->response->setHeader('Pragma', 'no-cache');
        $this->response->setHeader('Expires', '0');
        $this->response->sendHeaders();
        $this->view->assign('model', ['notFound'=> 1]);
    } else {
        $this->view->assign('model', $model);
    }
}

但这种方式会失去缓存带来的性能优势,所以还是优先推荐抛出异常的方案。

内容的提问来源于stack exchange,提问作者clive beckett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:53:47