我想为生产环境中的所有网站错误创建一个自定义404页面。例如,如果我收到丢失的控制器或查看错误,那么它将重定向到
http://example.com/404.html,
在某些情况下,我会故意重定向http://example.com/404.html
CakePHP 2.x早期通过在AppContoller.php中添加以下操作来完成
public function appError($error) {
$this->redirect('/page-not-found.html',301,false);
}
但它在CakePHP 3.x中不起作用,我想在CakePHP 3.x中复制相同的行为
答案 0 :(得分:2)
如果页面应呈现404,则采取的正确操作是以呈现404 。
重定向到另一个页面会让用户感到困惑,特别是因为许多浏览器缓存301响应,使原始URL无法访问。这也影响例如搜索引擎作为静态文件404.html
将有200个响应代码(除非您修改了您的网络服务器配置),因此它会说404但不是。
The blog tutorial指导您朝着正确的方向前进:
public function view($id)
{
$article = $this->Articles->get($id);
$this->set(compact('article'));
}
表方法get返回单个实体对象或抛出异常:
如果get操作没有找到任何结果,将引发Cake \ Datasource \ Exception \ RecordNotFoundException。您可以自己捕获此异常,也可以允许CakePHP将其转换为404错误。
此示例中的控制器代码不需要具有任何"如果它不存在"处理因为默认如果记录不存在,结果是404.
如果您想更改404或500页面的显示方式change the template files
对于所有4xx和5xx错误,分别使用模板文件error400.ctp和error500.ctp。
错误模板为in your application,请注意在生产模式the output is very minimal。
答案 1 :(得分:0)
如果get操作未找到任何结果,则会引发Cake\Datasource\Exception\RecordNotFoundException
。您可以自己捕获此异常,也可以允许CakePHP将其转换为404错误。
答案 2 :(得分:0)
最简单的方法可以分两步实施,
第1步:
在config / app.php中关闭调试模式
第2步:
将src/Template/Layout/error.ctp
的内容替换为您的自定义布局。