我是覺得錯誤頁面重定向分為兩種
造成不同點在於入口index.php文件,差別
define('APP_DEBUG',false);
一 按手冊 搜索 “異常處理”,那樣配置,我覺得這種配置是在, APP_DEBUG 為TRUE的情況處理的
在config 文件配置
'SHOW_PAGE_TRACE' => false, 'SHOW_ERROR_MSG' => false, 'ERROR_MESSAGE' => '發生錯誤!', 'ERROR_PAGE' =>'/Public/error', /* 錯誤頁面模板 */ 'TMPL_ACTION_ERROR' => MODULE_PATH.'View/Public/error.html', // 默認錯誤跳轉對應的模板文件' 'TMPL_ACTION_SUCCESS' => MODULE_PATH.'View/Public/success.html', // 默認成功跳轉對應的模板文件' 'TMPL_EXCEPTION_FILE' => MODULE_PATH.'View/Public/error.html',// 異常頁面的模板文件
當然 你要確保你的文件路徑是對的
二 當我們上線的正式環境是,調試是要關閉的APP_DEBUG 為false的情況處理的,那么就會發現一個坑!!!!!
輸入錯誤的路徑,你會發現 竟然不會跳轉到 你定義的404頁面!!!!!
后面再這里找到辦法https://www.cnblogs.com/dee0912/p/5140063.html
一、入口文件關閉調試,配置文件配置異常頁面
在生產環境中系統的錯誤信息不能暴露給用戶,入口文件的 APP_DEBUG 默認為開啟狀態
define('APP_DEBUG',true);
此時如果用戶訪問到不存在的模塊、控制器或者方法會出現:
在生產環境中需要把 APP_DEBUG 設置為 FALSE 或者將該定義屏蔽:
define('APP_DEBUG',false);
此時如果用戶訪問到不存在的模塊、控制器或者方法會出現:
這個錯誤的默認模板頁在 ./ThinkPHP/Tpl/think_exception.tpl,可以設置自定義的異常頁面來代替 ThinkPHP 默認的錯誤頁面,在配置文件 config.php 中配置:
//異常頁面 'TMPL_EXCEPTION_FILE' => './Public/Admin/error.html',
在訪問不存在的模塊、控制器或方法時,會加載默認的或者自定義的異常頁面模板。
二、定義 EmptyController 類
例如在 Admin 模塊下創建一個 EmptyController.class.php,里面的 index 方法定義當用戶訪問一個不存在的控制器時系統該如何處理:
<?php namespace Admin\Controller; use Think\Controller; class EmptyController extends Controller{ public function index(){ //跳轉或加載404頁 } }
三、定義空操作 _empty()
例如在 Admin 模塊的 Common 控制器中定義一個 _empty() 方法,當用戶訪問一個不存在的方法時,就會按照空方法中的設置進行處理:
//空方法 function _empty() { //跳轉或加載404頁 }
注:如果同時請求一個不存在的控制器和一個不存在的方法,或者請求一個不存在的模塊時,會加載默認或者自定義的異常頁面,而不會執行 EmptyController::index 或 _empty()。
四、數據庫錯誤
在默認情況下,如果程序中的 SQL 語句出現了語法錯誤,很可能會把數據庫信息暴露給用戶:
注:在 APP_DEBUG 為 TRUE 且沒有自定義異常頁面時發生數據庫錯誤會輸出以上信息。
在關閉 APP_DEBUG 后,遇到數據庫錯誤時,會加載默認的或者自定義的異常頁面。如果希望在發生數據庫錯誤時進行自定的處理時,可以在配置文件中設置數據庫調試模式為 FALSE(該配置默認值是 TRUE):
'DB_DEBUG' => FALSE, // 數據庫調試模式 開啟后可以記錄SQL日志 3.2.3新增
當該選項開啟時,會記錄 SQL 日志,路徑是 ./Application/Runtime/Logs/YourModule/
但是當該選項開啟時,無法自定義處理異常,只能加載系統默認或者自定義的一場模板。如果關閉該選項,同時在開發時與數據庫相關的操作都必須捕獲異常,例如:
$result = M('session')->field('a')->select(); if($result === false) { //處理 }
或者
try { $result= M("session")->field('a')->select(); } catch (\Exception $e) { //處理 }
注:捕獲異常可以參見 ./ThinkPHP/Library/Think/Db/Driver.class.php Line:169
try{ $result = $this->PDOStatement->execute(); // 調試結束 $this->debug(false); if ( false === $result ) { $this->error(); return false; } else { return $this->getResult(); } }catch (\PDOException $e) { $this->error(); return false; }