2015-03-09 4 views
0

Мое приложение ZF генерирует исключение вместо возврата 404 для URL-адресов, которые действительно 404s. Например. testlotto.ie/rrr должен быть 404, но я получаю следующее:Zend Exception вместо 404

Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (rrr)' in /mnt/pc/sites/git-lotto/lotto/irish-lotto/library/Zend/Controller/Dispatcher/Standard.php: 

Я попытался предложения по Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' while creating object of model class и Uncaught exception 'Zend_Controller_Dispatcher_Exception' (а также многие другие), и ничего не работает.

У меня есть контроллер ErrorController в директории ../application/controllers, который является тем, что возвращается, когда я умираю() из getControllerDirectory() из Controller/Dispatcher/Standard.php, поэтому проблем с контроллером не является найденный.

Мой ErrorController выглядит следующим образом (не то, что это имеет значение, поскольку он не вызывался):

<?php 
class ErrorController extends Zend_Controller_Action 
{ 


    public function errorAction() 
    { 
     $errors = $this->_getParam('error_handler'); 
     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()->setHttpResponseCode(404); 
       $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found'); 

       $content =<<<EOH 
<h1>Unlucky!</h1> 
<p>The url you entered is not a valid one - please check what you typed, the mistake is most likely there.</p> 
EOH; 
       break; 
      default: 
       // application error 
       $content =<<<EOH 
<h1>Error!</h1> 
<p>An unexpected error occurred. Please try again later.</p> 
EOH; 
       break; 
     } 

     // Clear previous content 
     $this->getResponse()->clearBody(); 

     $this->view->content = $content; 
    } 
} 

Начало метода депешу является:

public function dispatch(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response) 
    { 
     $this->setResponse($response); 

     /** 
     * Get controller class 
     */ 
     if (!$this->isDispatchable($request)) { 
      $controller = $request->getControllerName(); 
      //die($controller); 
      //$this->setParam('useDefaultControllerAlways',true); 

      //ErrorController::errorAction(); 
      if (!$this->getParam('useDefaultControllerAlways') && !empty($controller)) { 
       require_once 'Zend/Controller/Dispatcher/Exception.php'; 
       throw new Zend_Controller_Dispatcher_Exception('Invalid controller specified (' . $request->getControllerName() . ')'); 
      } 

      $className = $this->getDefaultControllerClass($request); 

Как вы можете видеть, я попробовал, как было предложено установить setParam ('useDefaultControllerAlways', true) ;, но все это достигается, когда страница веб-сайта отображается (стандартный контроллер, конечно) с кодом ответа 200. Мне нужно 404.

Кроме того, $ controller умирает как «rrr» в этом примере.

Мой вопрос - что мне нужно сделать, чтобы вернуть 404? Это использовалось для работы на моем сайте - я просто менял серверы, и теперь он не работает.

+0

См. Http://framework.zend.com/issues/browse/ZF-3465 – user3173104

+0

Я не думаю, что это проблема, поскольку пустой ($ controller) не является правдой (контроллер входит как 'rrr' Например, они всегда «перенаправляются на индекс/индекс», что не то, что происходит для меня. Я получаю исключение, указанное в деталях сообщения выше. – pokero

+0

Я имею в виду последний пост splits 'if (! $ this-> getParam ('useDefaultControllerAlways') &&! empty ($ controller)) 'условие в 2 частях. Вторая часть говорит' if (! empty ($ controller)) 'ie, а не пустой контроллер. Вы попробовали это? – user3173104

ответ

0

Единственное решение, которое я мог бы найти в этом, который работал (то есть сайт теперь корректно возвращает 404 для URL-адресов, которые не существуют), был взят из http://www.christopherhogan.com/2012/06/13/zend-framework-404-page/

В частности, добавив ниже мой файл начальной загрузки делает трюк:

try { 
    $frontController->dispatch(); //instead of just $frontController->dispatch(); 
} catch (Zend_Exception $e) { 
    // this is where the 404 goes 
    header('HTTP/1.0 404 Not Found'); 
    echo "<div style='float:center; width:1000px; margin:0 auto;'><img src='http://www.foundco.com/images/404.jpg' alt='Everything is gonna be fine, please do not panic!' /></div>"; 
} 

Однако, это не идеально, поскольку мой ErrorController не вызван в действие. Если бы кто-нибудь мог предложить, как вызвать свой ErrorController из файла начальной загрузки, было бы высоко оценено.

Смежные вопросы