Intereting Posts
PHP взорвать строку, но рассматривать слова в кавычках как одно слово Как использовать php preg_replace для замены тегов HTML Как захватить IP: PORT с регулярным выражением? (SOLVED) Электронная почта для xampp: ошибка синтаксического анализа: синтаксическая ошибка, неожиданный '@' Создание сообщений (т. Е. Черновиков) в Gmail с помощью IMAP / SMTP? назначение максимального числа в php & mysql mysqli multi_query, за которым следует запрос Плохой фильтр регулярных выражений слов не работает Узнайте, существует ли дата между двумя датами, игнорируя год Электронная почта с php-скриптом Валидация пользовательского клиента Yii2 с помощью ajax-рендеринга в модальных множественные приложения codeigniter с поддоменами wild card, mod_rewrite переназначение поддоменов в .php Как я могу создать успешную фабрику объектов домена в PHP index.php не открывается и не запускается при загрузке файла Список с отступом к многомерному массиву

Почему мой сайт всегда использует ErrorController для всех типов ошибок независимо от кода состояния HTTP?

Мы уже много лет работаем с сайтом электронной коммерции Zend Framework. Он не использовал структуру MVC 100%, но мы стараемся продвигать ее к «лучшей» структуре кодирования при выполнении новых обновлений на сайте и т. Д. Недавно мы внесли некоторые существенные изменения и на сайт. Поскольку есть несколько разработчиков, эту проблему немного сложно отследить, но я пишу здесь, чтобы получить какую-либо помощь или совет.

На нашем предыдущем сайте наш ErrorController использовался для простого перенаправления 301 на страницу «pagenotfound», когда что-то пошло не так, включая 404. Это продолжается на нашем новом сайте. Мы понимаем, что это не то, что должен делать веб-сайт, поэтому мы пытаемся изменить это, то есть использовать надлежащий код 404, когда мы находимся на 404, и так далее. При обновлении ErrorController только сейчас на нашем тестовом сайте я понял, что КАЖДОЕ действие на нашем сайте каким-то образом запускает ErrorController. Откуда я знаю это? Поскольку мой текущий тестовый сайт ErrorController выглядит следующим образом:

<?php /** @see Zend_Controller_Action */ require_once 'Zend/Controller/Action.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->view->message = 'Page not found'; break; default: // application error $this->getResponse()->setHttpResponseCode(500); $e = $this->_getParam('error_handler'); $this->view->message = $e['exception']->getMessage(); break; } $this->view->exception = $errors->exception; $this->view->request = $errors->request; } } 

Вышеприведенный код, теперь на моем тестовом сайте, хорош, но когда я перехожу на любую рабочую страницу (просматривая вкладку NET на Firebug), я вижу код состояния ошибки сервера «500». Это сюрприз, потому что для рабочих страниц он не должен даже правильно загружать ErrorController? Однако это так, и код состояния 500 (от случая по умолчанию выше) отправляется через.

Наш сайт также использует IndexController, а никаких дополнительных контроллеров – все наши действия находятся в IndexController. У нас есть специальный PagesAction:

 public function pagesAction() { $this->view->placeholder('errors')->captureStart(); //proceed as normal if ($this->checkSiteCode()) { //this will be false if we are not on the correct site code (ignore this) $this->view->this_includefile = "pages/view"; $this->getControllerIncludeFile($this->view->this_includefile); //include some special include file for our work } $this->view->placeholder('errors')->captureEnd(); } 

Вышеупомянутое действие по умолчанию для нашего бутстрапа, например, если вы перейдете на сайт www.mydomain.com/stores/, то вызывается вышеуказанные страницыAction (), чтобы проверить, существует ли «store» в нашей базе данных (CMS) и загружает контент соответствующим образом , Содержимое загружается отлично, но ошибка 500 все еще существует (на тестовом сайте). Поэтому мои вопросы:

  1. Ранее на старом сайте (который мы все еще можем получить через другой тестовый домен) эта проблема не возникает. Поэтому что-то – некоторые изменения в нашей конфигурации bootstrap или другом ключевом файле – вызвало это на нашем новом сайте. Это новый вопрос для нас, и я просто пытаюсь выяснить, где искать. Есть идеи? Однако я не вижу ссылок на «контролер ошибок» в моем загрузочном блоке. Вышеприведенное место для ошибок используется, потому что мы используем макет (новый для нового сайта), который по какой-то причине скрывает любые ошибки контроллера PHP, которые мы хотим видеть. Поэтому мы храним его в «записях ошибок» для печати с нашего вида. Это отдельный момент, но, вероятно, стоит отметить, поскольку мы не сделали этого на нашем старом сайте. Также существует несколько изменений в загрузке между старым и новым сайтами, которые мы сейчас сравниваем.

  2. Наша основная цель здесь – обновить pageAction, чтобы выбросить 404, когда конкретный URL-адрес не найден в нашей базе данных (а не перенаправлен на «pagenotfound», который является другой управляемой страницей CMS, то есть www.mydomain.com/pagenotfound/ является нормальным страница). В основном я спрашиваю, как закодировать его, чтобы на самом деле вызывал диспетчер ошибок, когда pagesAction понимает, что определенного URL-адреса не существует? Как только проблема 1 выше будет решена, мне нужно будет решить эту проблему, чтобы ErrorController мог загружать только при необходимости.

ОБНОВИТЬ

Мы только что выяснили, что следующий код в bootstrap.php, когда он удален, больше не загружает ошибку ErrorController и 501.

 $acl = new Zend_Acl(); $registry = Zend_Registry::getInstance(); $registry->set('acl', $acl); // store whole ACL definition to registry for use in AuthPlugin plugin 

Однако приведенное выше полностью отключает $ registry, поэтому я все еще ищу, какая строка на самом деле вызывает проблему, так как есть больше кодов, которые обращаются к реестру $. Я буду держать этот пост обновленным, но ЛЮБАЯ помощь по проблемам 1 и 2 выше была бы высоко оценена!

Related of "Почему мой сайт всегда использует ErrorController для всех типов ошибок независимо от кода состояния HTTP?"

Ты прав. То же самое было и разочарованием (я знаю, что чувствую, брат!)

В любом случае, вы можете определить, какой тип ошибки должен идти, где используется Zend_Http *

Как вы можете видеть, я изменил путь в свой ErrorController для «SET» кода состояния HTTP таким образом, он также изменит информацию «заголовка» на странице. Пример, вначале. Я проверяю Routes / Controllers / Actions, если ни один из них не найден, а затем установите значение 404, зарегистрируйте инцидент и визуализируйте скрипт!

 class ErrorController extends Zend_Controller_Action { public function errorAction() { $errors = $this->_getParam('error_handler'); if (!$errors || !$errors instanceof ArrayObject) { $this->view->message = 'You have reached the error page'; return; } switch ($errors->type) { case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE: 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); $priority = Zend_Log::NOTICE; $this->view->error_code = $this->getResponse()->getHttpResponseCode(); $this->view->message = "Page Not Found"; $this->renderScript('error/error_404.phtml'); break; default: // application error print_r($this->getResponse()); $this->getResponse()->setHttpResponseCode(500); $priority = Zend_Log::CRIT; $this->view->error_code = $this->getResponse()->getHttpResponseCode(); $this->view->message = 'Application error'; if ($log = $this->getLog()) { $log->log($this->view->message, $priority, $errors->exception); $log->log('Request Parameters', $priority, $errors->request->getParams()); $this->renderScript('error/error_500.phtml'); } // conditionally display exceptions if ($this->getInvokeArg('displayExceptions') == true) { $this->view->exception = $errors->exception; } $this->view->request = $errors->request; $this->view->error_code = $this->getResponse()->getHttpResponseCode(); $this->renderScript('error/error_500.phtml'); break; } // Log exception, if logger available if ($log = $this->getLog()) { $log->log($this->view->message, $priority, $errors->exception); $log->log('Request Parameters', $priority, $errors->request->getParams()); } // conditionally display exceptions if ($this->getInvokeArg('displayExceptions') == true) { $this->view->exception = $errors->exception; } $this->view->request = $errors->request; } public function getLog() { $bootstrap = $this->getInvokeArg('bootstrap'); if (!$bootstrap->hasResource('Log')) { return false; } $log = $bootstrap->getResource('Log'); return $log; } } 

Используй это 🙂 🙂

Наслаждайся жизнью!

Счастливое кодирование! 🙂