Magento“前端控制器达到100路由器匹配迭代”错误

时间:2011-06-07 07:50:06

标签: exception magento

当我的网站开始抛出异常“前端控制器达到100次路由器匹配迭代”时,我的网站每天都会停机一两次。一旦发生这种情况,访问管理员和前端就会消失。我刚刚离开了一个错误页面。

从Magento 1.5.0.1升级到1.5.1.0后开始。如果我手动清除var / cache /目录,我就会重新运行。

我已经用Google搜索了这个。在有限的搜索结果中,我发现没有什么能帮助我解决这个问题。

对于为什么会发生这种情况及如何解决这一问题的任何见解将不胜感激。

- 更新-----------------------

使用Andrey Tserkus的有用答案中提供的调试代码,我能够确定错误是由我的一些路由器消失引起的。

调试代码输出的普通路由器是: 总计7:管理员,标准,cms,amshopby,fishpig_wordpress,seosuite,默认

发生错误时,他们已更改为: 总计3:管理员,标准,默认

当发生这种情况时,似乎缺少的路由会导致代码针对每个页面请求迭代到100。我将进一步研究这种情况。

11 个答案:

答案 0 :(得分:13)

更新2:我有一些进一步的更改,应该有助于防止100路由器匹配迭代的不同原因

https://github.com/convenient/magento-ce-ee-config-corruption-bug#update-2-further-improvements

=============================================== =====================

更新:MAGENTO已将我的答案用作补丁

https://github.com/convenient/magento-ce-ee-config-corruption-bug#update-good-news-a-patch-from-magento

=============================================== =====================

我最近花了很长时间研究这个bug。我已经写完了我的全部发现,解释和复制here

https://github.com/convenient/magento-ce-ee-config-corruption-bug

然而,对于简短的回答。这似乎是一个Magento错误,可以通过覆盖以下Mage_Core_Model_Config::init来纠正:

 public function init($options=array())
 {
     $this->setCacheChecksum(null);
     $this->_cacheLoadedSections = array();
     $this->setOptions($options);
     $this->loadBase();

     $cacheLoad = $this->loadModulesCache();
     if ($cacheLoad) {
         return $this;
     }
     //100 Router Fix Start
     $this->_useCache = false;
     //100 Router Fix End
     $this->loadModules();
     $this->loadDb();
     $this->saveCache();
     return $this;
 }

编辑:更新以测试香草1.5

我刚刚在1.5的vanilla安装上运行了复制脚本。除了禁用CONFIG缓存外,其他所有缓存都已存在。

它没有像1.13那样产生100 router错误,但确实打破了网站,所有显示的主页都是白屏。

原因是,当我们寻找控制器和操作时,我们与Mage_Core_IndexController::indexAction而不是Mage_Cms_IndexController::indexAction匹配。

class Mage_Core_IndexController extends Mage_Core_Controller_Front_Action {

    function indexAction()
    {

    }
}

Mage_Core_IndexController::indexAction是一个空函数,完美地解释了白页。

_useCache = false放入Mage_Core_Model_Config时,我无法再复制此错误。

我相信也许你的Magento网站独特的配置可能会导致它完全无法匹配控制器,而不是回到这个Mage_Core_IndexController动作?

答案 1 :(得分:11)

错误消息过于笼统,无法尝试解决此问题。我建议你聘请一些自由职业者Magento网站开发人员来查看你实际网站上的问题来源。理论上无法解决。

从消息中可以看出,问题出现是因为您的路由器正在为调度请求进行循环引用。其中一个匹配请求,但不调度并再次将其推送到重新调度。或者根本没有路由器匹配请求。

您可以访问Magento核心文件app / code / core / Mage / Core / Controller / Varien / Front.php获取更多信息,找到行

while (!$request->isDispatched() && $i++<100) {
    foreach ($this->_routers as $router) {
        if ($router->match($this->getRequest())) {
            break;
        }
    }
}

并用

替换它们
Mage::log('----Matching routers------------------------------');
Mage::log('Total ' . count($this->_routers) . ': ' . implode(', ', array_keys($this->_routers)));
while (!$request->isDispatched() && $i++<100) {
    Mage::log('- Iteration ' . $i);
    $requestData = array(
        'path_info' => $request->getPathInfo(),
        'module' => $request->getModuleName(),
        'action' => $request->getActionName(),
        'controller' => $request->getControllerName(),
        'controller_module' => $request->getControllerModule(),
        'route' => $request->getRouteName()
    );

    $st = '';
    foreach ($requestData as $key => $val) {
        $st .= "[{$key}={$val}]";
    }
    Mage::log('Request: ' . $st);
    foreach ($this->_routers as $name => $router) {
        if ($router->match($this->getRequest())) {
            Mage::log('Matched by "' . $name . '" router, class ' . get_class($router));
            break;
        }
    }
}

在等待站点产生错误之后,打开var / log / system.log并查看有关系统内部情况的调试信息。这将有助于看到更好的,什么路由器打破了系统。

答案 2 :(得分:6)

此消息是由错误的缓存配置数据引起的。我不确定实际导致缓存配置损坏的原因 - 我猜它可能会有很多因Magento运行而异的事情。

我想,如果你仍然可以访问Magento后端,你可以在System&gt;下尝试清除缓存。缓存管理。如果这没有帮助(或者如果你无法访问Magento后端,这很可能出现此错误),那么通过查找&lt;的值来确定如何设置缓存。缓存&gt;&lt;后端&gt;在app / etc / local.xml中。如果你正在使用缓存文件(默认),你可以用

清除magento / var / cache
rm -rf /path/to/magento/var/cache/*

如果您正在使用memcached,请在&lt;下找到端口。端口&gt;你可以做到

telnet memcache_server portnumber
flush_all

或者,如果您使用的是redis,则可以

telnet redis_server portnumber
FLUSHALL

答案 3 :(得分:3)

我们遇到了同样的问题,并且挖得更深一些,发现这个问题并不直接与哪些路由器加载但是加载了哪些模块有关。

为了解决这个问题,我们添加了以下调试代码:

    app/code/core/Mage/Core/Controller/Varien/Front.php : Line 183

    if ($i>100) {
        file_put_contents('/tmp/debug.txt', Mage::getConfig()->getNode()->asNiceXml());
        Mage::throwException('Front controller reached 100 router match iterations');
    }

当我们检查输出时,我们可以看到只加载了Mage_Core模块(检查节点'config / modules'。我们认为存在某种竞争条件,这意味着系统留下了一个部分形成的配置然后被缓存。

如果你有相同的情况,会有兴趣听听。

答案 4 :(得分:3)

我尝试了以上所有建议,并没有得到任何结果。 然后,我试图进行备份,因为我将尝试升级,并且在读取文件时出现权限错误。这很奇怪,所以我更改了权限,它立即开始工作。

chmod 770 app / code / core / Mage / Cms / controllers / IndexController.php

希望这有助于某人。

答案 5 :(得分:2)

这个错误也困扰着我们的一个客户也有很高的负载..更改local.xml中的admin url值修复了这两个问题

答案 6 :(得分:1)

这可能对您没有帮助,但可能对其他人有所帮助。我出乎意料地遇到了同样的问题。

手动删除缓存和锁定确实解决了我的问题(暂时)。

答案 7 :(得分:0)

如果Magento缺少No-Route CMS页面(网址密钥no-route)或默认CMS No Route Page设置未在System=>Configuration=>Web=>Default Pages中正确设置,Magento可以进入无限循环,直到达到100次迭代限制。

答案 8 :(得分:0)

您的管理员名称可能与 app / etc / local.xml roouter-&gt; adminhtml-&gt; frontname 不匹配p>

从您的magento项目转到此目录 app / etc / local.xml ,并确保它与您的管理面板url-frontname必须相同;

<admin>
    <routers>
        <adminhtml>
            <args>
                <frontName><![CDATA[myadminfrontname]]></frontName>
            </args>
        </adminhtml>
    </routers>
</admin>

您的网址必须是这样的

http://www.myproject.com/myadminfrontname/

您也可以使用此代码删除缓存目录。

转到项目根目录并编写

rm -rfv var/*

答案 9 :(得分:0)

最后我解决了这个问题,这是由于etc frontend di.xml <item name="sortOrder" xsi:type="string">20</item>中的sortorder。我将20改为60并且错误消失了。

请参阅:Magento 2.1.2 Rourter action factory gets in to an infinite loop

答案 10 :(得分:-2)

这些是解决此类问题的最佳步骤:

  1. 修复Apache服务器。
  2. 如果子目录中有magento,则从.htaccess取消注释。
  3. 删除/var/cache目录并启用mod_rewrite
  4. 启用HTACCESS使用。
  5. 创建无路由CMS页面。
  6. 指定正确的404页面。
  7. 无法找到用户Cookie(可能的原因)。
  8. 有关实施上述步骤的更多详情,请点击以下链接: https://merchantprotocol.com/506/solved-front-controller-reached-100-router-match-iterations/

    我强烈建议您阅读Alan Strom的指示。 Alan Storm的指南链接:     http://alanstorm.com/magentos_many_404_pages