Как установить контроллер/действие на страницу Не найдено


У меня есть контроллер и действие, к которым я обращаюсь через пользовательский URL-адрес. Исходный маршрут по-прежнему доступен, хотя и в местоположении по умолчанию

zend.com/controller/action

Как я могу изменить это, чтобы имитировать "Страница не найдена", когда пользователь пытается получить доступ к этому URL-адресу? Возможно ли это?

Author: Charles, 2010-10-03

7 answers

Если обработчик действий используется для ответа на оба URL-адреса, вам сначала нужно будет определить, какой URL-адрес запрашивается (используя $this->_request->getrequesturi()). Если URL-адрес по умолчанию обнаружен, я думаю, что самый простой способ создать "не найденную страницу" - использовать

$this->_redirect("/path/to/simulated/404/page") 

И настройте контроллер и действие для ответа.

Однако на самом деле это не приведет к отправке HTTP 404. Чтобы сделать это, я думаю, вам придется создать исключение в вашем обработчике действий. Я не знаю, что за официальный способ "zendy" сделать это, но, похоже, это работает:

throw new Zend_Controller_Action_Exception('Not Found', 404);
 6
Author: bogeymin, 2010-10-21 12:19:48

Вы можете изменить сценарий основного контроллера, чтобы перенаправить определенное имя контроллера и имя действия на новую страницу. Но, вероятно, проще добавить новое правило в файл .htaccess, указав, что этот конкретный URL-адрес должен быть перенаправлен на страницу с ошибкой. Пример:

RewriteRule ^controller/action/?$ / [R=404,L]

Или перенаправьте страницу на страницу с ошибкой на вашем сайте:

RewriteRule ^controller/action/?$ /error/page-not-found/ [L]
 6
Author: Alec, 2010-10-03 19:45:24

Вам нужно использовать:

$this->getResponse()->setHttpResponseCode(404);

И создайте свой собственный вид 404

$this->view->message = 'Page not found';

Или вы можете перенаправить на контроллер ошибок, например

$this->_forward('page-not-found', 'error');

Наконец, если у вас есть в вашем контроллере ошибок

//...
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;
//...

Вы можете просто сделать так, как сказал @bogeymin:

throw new Zend_Controller_Action_Exception('Not Found', 404);
 3
Author: Keyne Viana, 2010-10-15 19:50:32

Если вы ищете другие решения, кроме основанных на mod_rewrite, вы можете создать маршрут регулярного выражения , соответствующий действиям, которые вам нужно скрыть.

Другое решение состоит в том, чтобы ограничить доступ к действиям с помощью Zend_Acl, рассматривая каждое действие как ресурс ACL.

Но самое простое и легкое решение по-прежнему mod_rewrite в .htaccess.

Редактировать:

Как вы можете видеть, это можно сделать множеством способов. Но, вероятно, вам понадобится какой-то переключите, чтобы все равно каким-то образом разрешить доступ к "скрытому" действию. В этом случае используйте:

  • mod_rewrite для быстрой реализации (переключение требует, чтобы человек знал правила .htaccess)
  • zend_router - человек, который знает правильный маршрут, все еще может получить доступ к этой функции
  • Zend_Aclзенд_акл + Zend_Auth для масштабируемого и безопасного решения.

Если вам не нужны аутентифицированные пользователи, Zend_Acl в сочетании с Zend_Router может быть решение.

Для умной обработки исключений и создания списков управления доступом см. Это (и другие сообщения в этом блоге):

Обработка ошибок в Zend Framework | CodeUtopia - Блог Яни Хартикайнена

 3
Author: takeshin, 2010-10-17 07:53:42

По умолчанию маршрутизатор включает маршруты по умолчанию для :module/:controller/:action/ и :controller/:action/. Вы можете отключить их с помощью:

$router->removeDefaultRoutes();

Тогда будут работать только настроенные вами маршруты. Если вы все еще хотите использовать маршруты по умолчанию для некоторых других целей, вам придется либо использовать один из других опубликованных ответов, либо добавить свои собственные маршруты "по умолчанию", которые будут соответствовать всем, кроме модулей/контроллеров, для которых у вас есть пользовательские маршруты.

 3
Author: Tim Fountain, 2010-10-18 10:56:37

Если вы не хотите удалять маршрут по умолчанию, как предлагает @Tim Fountain, вам следует сделать что-то подобное в своем контроллере (либо preDispatch, либо whateverAction методы)

$router = $this->getFrontController()->getRouter();
$route = $router->getCurrentRouteName();
// if we reached this controller/action from the default route, 404
if ($route == 'default')
{
  throw new Zend_Controller_Action_Exception('Not Found', 404);
}
 2
Author: gnarf, 2017-05-23 12:04:10

Я думаю, что все приведенные выше ответы неверны. Они показывают способы достижения того же самого, но представляют логику в неправильном месте в вашем приложении, что в конечном итоге может вызвать проблемы позже.

Правильная часть вашей логики маршрута, насколько она чрезвычайно проста, в маршрутах. Чего не хватает, так это того, что маршрут по умолчанию Zend_Controller_Router_Route_Module не позволяет добавлять исключения к определенным маршрутам. Итак, что вам нужно сделать, это удалить маршрут по умолчанию из ваших маршрутов и добавить новый пользовательский маршрут (который должен функционировать точно так же, как маршрут по умолчанию, но позволяет исключать) на своем месте.

Вы можете написать новый маршрут, расширив класс маршрута по умолчанию.

class My_Custom_Route extends Zend_Controller_Router_Route_Module
{
    protected $_excludes = array();

    public function exclude($abc)
    {
         //add to $_excludes here the controller/action you want to exclude
    }

    public function match($abc)
    {
         //add functionality here that denies if the mod/contr/action is in $_excludes
         //you can also add this in a separate method
         //re-use parent code
    }
}

Теперь вы можете добавить исключения, например, в файл конфигурации, и загрузить + добавить исключения в том месте, где вы инициируете новый маршрут (и добавляете его в маршрутизатор). Уходи.

 0
Author: user228395, 2010-10-22 10:39:33