在Observer中输入404页面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Observer中输入404页面相关的知识,希望对你有一定的参考价值。

我有一个观察者:<controller_action_predispatch_catalog_category_view>在我的观察者中触发一个函数来检查用户限制。

如果不允许客户查看此类别,我想向他们显示默认的Magento 404错误页面。这就是我现在被困住的地方。

当我查找404页面控制器时:<Mage_Cms_IndexController>它向我展示了这个函数“defaultIndex”:

$this->_forward('defaultIndex');

这个功能是什么:

public function defaultIndexAction()
{
    $this->getResponse()->setHeader('HTTP/1.1','404 Not Found');
    $this->getResponse()->setHeader('Status','404 File not found');

    $this->loadLayout();
    $this->renderLayout();
}

但在我的观察者中,我不能称之为loadLayoutrenderLayout的方法非常明显。

我不想使用301/302重定向到404页面,我想直接向用户显示它而不需要任何重定向。

我现在得到了什么:

Mage::app()->getFrontController()->getResponse()->setHeader('HTTP/1.1','404 Not Found');
Mage::app()->getFrontController()->getResponse()->setHeader('Status','404 File not found');

- 我需要渲染404页面而不是目录布局,但我该怎么做?

任何建议将不胜感激。

答案

回答:

我不能马上使用->_forward。它需要首先初始化。

Mage::app()->getFrontController()->getResponse()->setHeader('HTTP/1.1','404 Not Found');
Mage::app()->getFrontController()->getResponse()->setHeader('Status','404 File not found');

$request = Mage::app()->getRequest();
$request->initForward()
    ->setControllerName('indexController')
    ->setModuleName('Mage_Cms')
    ->setActionName('defaultNoRoute')
    ->setDispatched(false);

希望这有助于某人:)

另一答案

我能够实现这一点而不会弄乱请求对象,p!

$exception = new Mage_Core_Controller_Varien_Exception("404 THIS REQUEST");
$exception->prepareForward('norouteAction');
throw $exception;

那成功地去了我的商店404页面:)

原因是它在catchMage_Core_Controller_Varien_Action::dispatch拾起,后者处理前进到norouteAction

public function dispatch($action)
{
    try {
        $actionMethodName = $this->getActionMethodName($action);
        if (!method_exists($this, $actionMethodName)) {
            $actionMethodName = 'norouteAction';
        }

        Varien_Profiler::start(self::PROFILER_KEY.'::predispatch');
        $this->preDispatch();
        Varien_Profiler::stop(self::PROFILER_KEY.'::predispatch');

        if ($this->getRequest()->isDispatched()) {
            /**
             * preDispatch() didn't change the action, so we can continue
             */
            if (!$this->getFlag('', self::FLAG_NO_DISPATCH)) {
                $_profilerKey = self::PROFILER_KEY.'::'.$this->getFullActionName();

                Varien_Profiler::start($_profilerKey);
                $this->$actionMethodName();
                Varien_Profiler::stop($_profilerKey);

                Varien_Profiler::start(self::PROFILER_KEY.'::postdispatch');
                $this->postDispatch();
                Varien_Profiler::stop(self::PROFILER_KEY.'::postdispatch');
            }
        }
    }
    catch (Mage_Core_Controller_Varien_Exception $e) {
        // set prepared flags
        foreach ($e->getResultFlags() as $flagData) {
            list($action, $flag, $value) = $flagData;
            $this->setFlag($action, $flag, $value);
        }
        // call forward, redirect or an action
        list($method, $parameters) = $e->getResultCallback();
        switch ($method) {
            case Mage_Core_Controller_Varien_Exception::RESULT_REDIRECT:
                list($path, $arguments) = $parameters;
                $this->_redirect($path, $arguments);
                break;
            case Mage_Core_Controller_Varien_Exception::RESULT_FORWARD:
                list($action, $controller, $module, $params) = $parameters;
                $this->_forward($action, $controller, $module, $params);
                break;
            default:
                $actionMethodName = $this->getActionMethodName($method);
                $this->getRequest()->setActionName($method);
                $this->$actionMethodName($method);
                break;
        }
    }
}

以上是关于在Observer中输入404页面的主要内容,如果未能解决你的问题,请参考以下文章

IIS配置404页面配置,IIS自定义404页面

WordPress404页面自定义

为啥我的IE在输入格中随便输入啥都是404页面如:中国,百度。360浏览器确没问题. 求高人解决 .

Fragment Recreation 导致 Observer 使用 Androidx Navigation 库触发 onChanged()

.htaccess 重定向到 404 页面 RewriteRule

如果用户在页面名称之后输入尾随“/”(或“/”之后的任何内容),我如何将用户重定向到错误 404 页面?