CakePHP 3.X中的自定义404页面

CakePHP 3.X中的自定义404页面,cakephp,Cakephp,我想创建一个自定义404页面,用于所有出现在生产环境网站上的错误。例如,如果我收到丢失的控制器或视图错误,那么它将重定向到 http://example.com/404.html,在某些情况下,我会故意重定向它http://example.com/404.html 在前面的CakePHP2.x中,它是通过在AppContoller.php中添加以下操作来完成的 public function appError($error) { $this->redirect('/page-not

我想创建一个自定义404页面,用于所有出现在生产环境网站上的错误。例如,如果我收到丢失的控制器或视图错误,那么它将重定向到
http://example.com/404.html,
在某些情况下,我会故意重定向它
http://example.com/404.html

在前面的CakePHP2.x中,它是通过在AppContoller.php中添加以下操作来完成的

public function appError($error) {
    $this->redirect('/page-not-found.html',301,false);
} 
但是它在CakePHP 3.x中不起作用,我想在CakePHP 3.x中复制相同的行为 如果页面应该呈现404,则要采取的正确操作是呈现404

重定向到另一个页面会让用户感到困惑,特别是因为许多浏览器会缓存301响应,从而无法访问原始url。例如,这也会影响搜索引擎,因为静态文件
404.html
将有200个响应代码(除非您修改Web服务器配置),所以会显示404,但不会显示

,这是所有开发人员在启动项目之前都应该做的,它将引导您朝着正确的方向前进:

public function view($id)
{
    $article = $this->Articles->get($id);
    $this->set(compact('article'));
}
table方法返回单个实体对象或抛出异常:


如果get操作未找到任何结果,将引发Cake\Datasource\Exception\RecordNotFoundException。您可以自己捕获此异常,也可以允许CakePHP将其转换为404错误

本例中的控制器代码不需要任何“如果它不存在怎么办”处理,因为默认情况下,如果记录不存在,结果是404

更改404模板 如果您想更改404或500页的外观

对于所有4xx和5xx错误,分别使用模板文件error400.ctp和error500.ctp


错误模板是,请注意,在生产模式下。

如果get操作未找到任何结果,将引发
Cake\Datasource\Exception\RecordNotFoundException
。您可以自己捕获此异常,也可以允许CakePHP将其转换为404错误。

最简单的方法可以分两步实现

步骤1:

在config/app.php中关闭调试模式

步骤2:


用自定义布局替换
src/Template/Layout/error.ctp
的内容。

出现
404
错误时,不应重定向用户,只需使用默认的
404
即可,但在某些情况下,当用户在域内手动更改url时,我必须将该用户重定向到404页面“当用户手动更改url时”是什么意思?如果用户输入了一个不正确的url,那么cake将抛出一个错误并显示一个404错误,您不必将它们重定向到自定义页面。假设我有一个url结构,其中blogs是目录,24是blog的id,我使用这个id进行数据库查询。现在,如果某个用户在浏览器中更改了(此ID),并且查询结果为空数据,那么我想将用户重定向到自定义404页面。如果发生这种情况,您应该抛出
Cake\Network\Exception\NotFoundException
,而不是重定向,如果配置良好,这将导致404错误。