当用户访问到不存在的模块、控制器或者方法会出现:页面错误!请稍后再试~
为了更好的用户体验,我们将错误页面跳转到指定的404页面,下面是三种实现方法.
方法一:
这个错误的默认模板页在 ./ThinkPHP/Tpl/think_exception.tpl,可以设置自定义的异常页面来代替 ThinkPHP 默认的错误页面,
在配置文件 config.php 中配置:
//404错误页面跳转
'TMPL_EXCEPTION_FILE' => './Public/Home/error.html',
在访问不存在的模块、控制器或方法时,会加载默认的或者自定义的异常页面模板。
方法二:
定义 EmptyController 类
例如在 Home 模块下创建一个 EmptyController.class.php,
namespace Home\Controller;
use Think\Controller;
class EmptyController extends Controller{
public function _empty(){
//_empty() 方法定义当用户访问一个不存在的控制器里的不存在的方法时系统处理
header( " HTTP/1.0 404 Not Found" );
header('Location:/404.html');
}
public function index(){
//index 方法定义当用户访问一个不存在的控制器时系统处理
header('HTTP/1.0 404 Not Found');
header('Location:/404.html');
}
}
注:如果用户访问已有的控制器里的不存在的方法时,可以在控制器继承的上一级里定义空操作 _empty()
方法三:
在配置文件 config.php 中配置:'ERROR_PAGE'=>'/404.html' #这里的页面要从根路径开始
这个配置好了效果挺好用的,3.2.3里好像有问题,如果不正常需要修改以下地方代码,第306行
ThinkPHP\Library\Think\Think.class.php
官方代码是://否则定向到错误页面
$error_page = C('ERROR_PAGE');
if (!empty($error_page)) {
redirect($error_page);
} else {
$message = is_array($error) ? $error['message'] : $error;
$e['message'] = C('SHOW_ERROR_MSG')? $message : C('ERROR_MESSAGE');
}
我们需要把redirect($error_page);替换//否则定向到错误页面
$error_page = C('ERROR_PAGE');
if (!empty($error_page)) {
//redirect($error_page);
header('HTTP/1.1 301 Moved Permanently');
header('Location: '.$error_page);
} else {
$message = is_array($error) ? $error['message'] : $error;
$e['message'] = C('SHOW_ERROR_MSG')? $message : C('ERROR_MESSAGE');
}
总结:
第一种方法:只能指定模版文件,不能指定跳转页面
第二种方法:要写的地方太多
第三种方法:个人觉得很方便,修改一处就好,可以跳转到指定方法和文件
配图: