2012-03-13 2 views
4

Я запускаю сайт сообщества Magento (в версии 1.5.1), и у меня проблема с страницами «404».Как регистрировать Magento «404» страницы

У нас есть пользователи, приземляющиеся на нашем сайте, из прямых ссылок, а также из результатов поиска google/bing. Страницы, на которые они идут, могут быть неправильными, поскольку они, возможно, изменились. Magento использует MVC для маршрутизации запросов к правильному контроллеру, но когда контроллера нет, Magento отображает статическую страницу CMS (т. Е. Страницу «404»). Проблема в том, что эта страница не позволяет мне писать собственный PHP-код на нем, поэтому я не могу зарегистрировать URL-адрес, который вызвал 404.

Если я могу найти правильную точку в коде перед отображением CMS 404, тогда я могу зарегистрировать URL-адрес и использовать его для соответствующей перезаписи URL-адресов.

Может кто-нибудь помочь мне в том, где код, который, наконец, сдается на любом контроллере и отображает пользовательскую страницу CMS «404»?

ответ

4

В основном это происходит в Mage_Cms_IndexController::noRouteAction(). Но вы также можете просто взглянуть на журнал своих веб-серверов для записей с кодом возврата 404 (404 задан тем же методом).

+0

Спасибо за ваш ответ. Навигация по Magento - это боль в пресловутой, что означает, что у него хорошая абстрактная архитектура, я думаю. Ваша помощь неоценима. – Enigmativity

1

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

/** 
* Render CMS 404 Not found page 
* 
* @param string $coreRoute 
*/ 
public function noRouteAction($coreRoute = null) 
{ 
    $this->getResponse()->setHeader('HTTP/1.1','404 Not Found'); 
    $this->getResponse()->setHeader('Status','404 File not found'); 

    /* JCS */ 
    $path = $this->getRequest()->getPathInfo(); 

    if (!startsWith($path, '/media/')) { 
     if (!startsWith($path, '/images/')) { 
      if (!startsWith($path, '/ebay/')) { 
       if (!startsWith($path, '/app/')) { 
        Mage::log('JCS:noRouteAction:path:'.$path); 
       } 
      } 
     } 
    } 

    $pageId = Mage::getStoreConfig(Mage_Cms_Helper_Page::XML_PATH_NO_ROUTE_PAGE); 
    if (!Mage::helper('cms/page')->renderPage($this, $pageId)) { 
     $this->_forward('defaultNoRoute'); 
    } 
} 

Я также добавил startsWith функцию:

/* JCS */ 
function startsWith($haystack, $needle) 
{ 
    $length = strlen($needle); 
    return (substr($haystack, 0, $length) === $needle); 
} 
Смежные вопросы