zend 404处理

zend framework控制404
大概有这么几种情况:

1、假如用户输入不存在的新闻id,而url结构正确,控制器和action都存在。
则程序员需要手动跳转到一个错误页面(您要找的页面不存在),最终返回给用户的http响应码是404。

2、假如用户输入不存在 的控制器名或action名,则程序需要跳转同上那个页面,响应码也是404。

3、假如程序本身有错误,执行时应该显示错误。让程序员能够准确定位。如果部署到服务器上的时候,则应该不显示任何错误。什么响应码无关紧要。


这么多情况中,web服务器的设置如apache不需要任何改动。
php.ini则需要满足第3种情况。

为满足第2种,需要添加一个ErrorController

<?php
class ErrorController extends Zend_Controller_Action
{
/**
* 自定义的的错误页面
*
* 404特别处理
* 500也显示错误信息。
*
*/
public function errorAction()
{
$errors = $this->_getParam('error_handler');
$exception = $errors->exception;

switch ($errors->type) {
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
// 404 error -- controller or action not found
$this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');

$content ='您要找的页面不存在';
// Clear previous content
$this->getResponse()->clearBody(); //清除掉别的信息
$this->view->content = $content; //404页面需要美观,所以有专门的模板
break;
default:
//这句话是个人写的,判断是否是部署服务器
$systemname = get_cfg_var('zendconfig.config_user');

if ($systemname=='real_server') { //假如是远程
$content = "服务器忙,请稍候";//服务器错误时,欺骗顾客

} else { //否则要让程序员看错误信息
// application error
$message1 = $exception->getMessage();
//正则只是换个换行符号
$message1 = preg_replace('#\n#', "<br />\n", $message1);
$message2 = $exception->getTraceAsString();
$message2 = preg_replace('#\n#', "<br />\n", $message2);

$content =$message1 . "<hr />" . $message2 ;
}
$this->_helper->viewRenderer->setNoRender(); //不用模板直接显示
echo $content;
break;
}
}
}



为了满足第一种情况,需要再编写方法,提示给用户的内容应该尽量与页面不存在的模版完全一样。

当数据库里找不到新闻时,代码类似如下
可以考虑换一个控制器

//该方法模拟找不到新闻时的场景,如果
public function test2Action()
{

$response = $this->getResponse();
$this->_helper->viewRenderer->setNoRender();
$this->_forward('/tool/test3');//如果使用了模块,可以再带上模块名
}

//该方法是
public function test3Action()
{
$this->_helper->viewRenderer->setNoRender();
//只要是这个页面的输出,都是404
$this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');
echo "这是新闻找不到的错误页面";//可以设法让其显示的跟前面的页面一样
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值