ThinkPHP 5.0/5.1 自定義404介面的配置
阿新 • • 發佈:2019-02-19
★ 背景
- 還要啥背景,就是覺得不可能用框架自帶的 404 介面唄.
- 可能跟之前的版本配置方法有點區別,在此做一下簡單的筆記
框架:
ThinkPHP 5.1
,ThinkPHP5.0.20
★ 配置過程
♩. 修改 config.app
檔案
- 第一,需要關閉除錯模式
// 應用除錯模式
'app_debug' => false,
一般在專案的開發過程中,可以設定為
"true"
,但是專案上線部署後,一定要關閉除錯模式
- 第二,增加或修改配置項:
http_exception_template
如果是
ThinkPHP.5.0
框架,進行修改如下:
'http_exception_template' => [ // 定義404錯誤的重定向頁面地址 404 => APP_PATH . 'index/view/exception_html/404.html', 500 => APP_PATH . 'index/view/exception_html500.html', ],
如果是
ThinkPHP.5.1
框架,進行修改如下:
//TODO 自定義異常請求碼的頁面配置 建議只做非500錯誤頁面
'http_exception_template' =>
[
404 => Env::get('app_path') . 'index/view/exception_html/404.html',
500 => Env::get('app_path') . 'index/view/exception_html/500.html',
],
上面的路徑配置,對應的檔案路徑是這樣的,同理可以擴充套件新增其他的請求碼配置頁:
♪. 靜態資源的引用
- 這一點其實沒必要講,我只是給一個參考
- 為了專案的介面設計統一性,至少頭部尾部都是一致的,以我為例,將自定義頁面的靜態檔案都放置在了
public/errors
目錄下
★ 演示效果
- 在自己的專案連結中,隨意輸入不能訪問的連結,則會出現配置的 404 介面,其他同理顯示
★ 500不支援
①. 探討參考
- 根據以上的操作,其實並不能匹配響應出 500 頁面
- 追索原始碼發現跟
Handle
中的render()
方法有關,進一步分析程式碼,應該是 **500 ** 情況不能例項化HttpException
的原因 - 原本試著修改瞭如下圖中的對應程式碼,但是 框架預設將出錯資料都認為了是 500 異常報錯
原始碼參考如下:
if ($e instanceof HttpException) {
return $this->renderHttpException($e);
} else {
$response = $this->convertExceptionToResponse($e);
$code = $response->getCode();
if ($code == 500){
$e = new HttpException(500,'The server is dead !',$e);
return $this->renderHttpException($e);
}else{
return $this->convertExceptionToResponse($e);
}
//修改前
//return $this->convertExceptionToResponse($e);
}
極不建議修改框架核心原始碼,指不定又會整出來多少安全隱患,此處只是一個小提示而已!僅做了解即可…
②. 另一種解決方案
- 修改
config.app
檔案中的配置項exception_tmpl
,線上和線下可分開配置
//TODO 異常頁面的模板檔案,主要作為500或程式報錯的處理頁面
//此為生產模式下(線下)的配置操作,便於程式碼排錯
'exception_tmpl' => Env::get('think_path') . 'tpl/think_exception.tpl',
//此為線上模式下的配置操作,便於隱藏內部錯誤資料,人性化顯示
//'exception_tmpl' => Env::get('think_path') . 'tpl/self_exception.html',
對於上述的配置項,主要是制定好顯示頁面即可,源框架中是
tpl
檔案,此處我直接複製了一個靜態頁面的原始碼而已,具體的動態顯示可以自己進行優化補充 …
③. 顯示效果
-
如果是線上下的測試環境,app_debug 開啟,同時
exception_tmpl
為前者配置項,只要在控制器中隨便寫一點錯誤程式碼,就會出現500
報錯,則效果如下:
-
如果是在線上的外網環境,app_debug 關閉,同時
exception_tmpl
為後者配置項,如此一來, 報錯頁面如下:
★ 附錄
♩ 推薦學習
♪ 動態設定模板
- 如果針對不同的客戶端情況可以動態設定模板,比如類似如下的程式碼形式
if (request()->isMobile()) {
config('template.view_path','application\\index\\view\\wap\\');
} else {
config('template.view_path','');
}
♫ 想了想
- 想了想,參考的原始碼也沒啥必要上傳的,所以,自己動手哦 …
- 重申,極不建議修改框架核心原始碼
- 其實我很好奇,***ThinkPHP5.1 和 Laravel5.5 到底是什麼關係?***怎麼設計的那麼 像!像!像!