我是以爲錯誤頁面重定向分爲兩種php
形成不一樣點在於入口index.php文件,差異html
define('APP_DEBUG',false);
一 按手冊 搜索 「異常處理」,那樣配置,我以爲這種配置是在, APP_DEBUG 爲TRUE的狀況處理的數據庫
在config 文件配置session
'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',// 異常頁面的模板文件
固然 你要確保你的文件路徑是對的this
二 當咱們上線的正式環境是,調試是要關閉的APP_DEBUG 爲false的狀況處理的,那麼就會發現一個坑!!!!!spa
輸入錯誤的路徑,你會發現 居然不會跳轉到 你定義的404頁面!!!!!debug
後面再這裏找到辦法https://www.cnblogs.com/dee0912/p/5140063.html調試
在生產環境中系統的錯誤信息不能暴露給用戶,入口文件的 APP_DEBUG 默認爲開啓狀態日誌
define('APP_DEBUG',true);
此時若是用戶訪問到不存在的模塊、控制器或者方法會出現:code
在生產環境中須要把 APP_DEBUG 設置爲 FALSE 或者將該定義屏蔽:
define('APP_DEBUG',false);
此時若是用戶訪問到不存在的模塊、控制器或者方法會出現:
這個錯誤的默認模板頁在 ./ThinkPHP/Tpl/think_exception.tpl,能夠設置自定義的異常頁面來代替 ThinkPHP 默認的錯誤頁面,在配置文件 config.php 中配置:
//異常頁面 'TMPL_EXCEPTION_FILE' => './Public/Admin/error.html',
在訪問不存在的模塊、控制器或方法時,會加載默認的或者自定義的異常頁面模板。
例如在 Admin 模塊下建立一個 EmptyController.class.php,裏面的 index 方法定義當用戶訪問一個不存在的控制器時系統該如何處理:
<?php namespace Admin\Controller; use Think\Controller; class EmptyController extends Controller{ public function index(){ //跳轉或加載404頁 } }
例如在 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; }