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
相关产品推荐
相关产品推荐

