php跳转404_ThinkPHP设置404跳转页面

ThinkPHP3.2.3设置404跳转页面

在ThinkPHP3.2版本中当我们访问不存在的页面时会出现错误提示页面:

54837a872705?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

error.png

解决办法:

1.在ThinkPHP3.2详细的介绍了该框架下的ThinkPHP惯例配置文件convention.php(文件位置:根目录/ThinkPHP/Conf/convention.php),里面列出各类配置类。

在该文件下可以看到:

'TMPL_EXCEPTION_FILE' => THINK_PATH.'Tpl/think_exception.tpl',// 异常页面的模板文件

'ERROR_PAGE' => '', // 错误定向页面

2.只要在根目录/Application/Common/Conf/config.php 文件中加入以下:

'TMPL_EXCEPTION_FILE' => './404.html',// 异常页面的模板文件

'ERROR_PAGE' => './404.html', // 错误定向页面

引导用户输入错误的url路径全部跳转到404.html页面即可。

ThinkPHP5.0设置404跳转页面

首先要在你的配置文件将调试模式关闭(在开发阶段要打开)

'app_debug' => false,

然后在配置文件中配置404等页面的模板路径(APP_PATH指的是application路径):

'http_exception_template' => [

404 => APP_PATH.'404.html',

403 => APP_PATH.'404.html',

]

使用\think\exception\HttpException类来抛出异常

// 抛出 HTTP 异常

throw new \think\exception\HttpException(404, '异常消息', null, [参数]);

一旦抛出了HttpException异常,可以支持定义单独的异常页面的模板地址,只需要在应用配置文件中增加:

'http_exception_template' => [

// 定义404错误的重定向页面地址

404 => APP_PATH.'404.html',

// 还可以定义其它的HTTP status

401 => APP_PATH.'401.html',

]

然而如果你这些都做完了,关闭调试模式,你会发现还是跳转到官方自定义的页面上去了,并且你发现http状态码是500,这是代码有问题啊,我抛出的是404啊。

然后打开log日志,你会发现果然报错了。

[ error ] [1]Uncaught think\exception\TemplateNotFoundException: template not exists:view/layout.html in /Applications/MAMP/htdocs/best.shiqidu.com/thinkphp/library/think/Template.php:1082

Stack trace:

你会发现这个方法被调用了两次。

/**

* 解析模板文件名

* @access private

* @param string $template 文件名

* @return string|false

*/

private function parseTemplateFile($template)

{...}

第一次时$template模板文件时能找到的。但是第二次也是一个相对路径view/layout,所以报错了,继续顺藤摸瓜,发现这个函数。

/**

* 编译模板文件内容

* @access private

* @param string $content 模板内容

* @param string $cacheFile 缓存文件名

* @return void

*/

private function compiler(&$content, $cacheFile)

{

// 判断是否启用布局

if ($this->config['layout_on']) {

if (false !== strpos($content, '{__NOLAYOUT__}')) {

// 可以单独定义不使用布局

$content = str_replace('{__NOLAYOUT__}', '', $content);

} else {

// 读取布局模板

$layoutFile = $this->parseTemplateFile($this->config['layout_name']);

if ($layoutFile) {

// 替换布局的主体内容

$content = str_replace($this->config['layout_item'], $content, file_get_contents($layoutFile));

}

}

} else {

$content = str_replace('{__NOLAYOUT__}', '', $content);

}

...

关键就是这里了,如果你没有{NOLAYOUT}这个表示的话,它在渲染自定义404页面时会去加载布局文件(如果你在配置文件里开启了布局,如果没开启layout=true,也不会报这个错)。

而这个布局文件的路径是一个相对路径,这时如果你抛出异常的地方不是在application的controller里,就找不到布局文件了。所以就报错了。

怎么解决呢?其实也很简单。给自定义的404页面加上{NOLAYOUT}就行了。

54837a872705?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

5d4af532dcaeab4d661a2932fcf09552.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值