问题:管理页面上的# Magento 404

大约一周前,我在一个新站点的测试环境中工作。我离开了一个小时,回来了,现在无法进入管理页面,因为'http://magento.localhost.com/admin'导致 No Route 404。我是唯一可以访问的人对此,它在任何意义上都不是活的。我正在使用带有 Ubuntu 的 VBox 来托管环境。在可能的修复方面,到目前为止,我已经尝试过......

  • 确保 core_store、core_store_group、core_website 和 customer_group 表 id 设置为 0(如本文和许多其他文章中所述 -http://www.nude-webdesign.com/修复-for-magento-admin-error-404-page-not-found/)

  • 玩弄 /app/code/core/Mage/Core/Controller/Varien/Front.php 方法 _isAdminFrontNameMatched 显示 adminPath (它是 ‘admin’)

  • 清空var文件夹,清空浏览器缓存。网站的缓存过去和现在都关闭了。

  • 将 'index.php' 添加到 url 仍然会导致 404。

  • 根据Magento Admin 404,文件 'app/etc/use_cache.ser' 对我来说不存在。

在发生这种情况的那天,我只是在玩弄一些我复制到我制作的模块的布局文件和主题的媒体查询(甚至在这个问题开始发生之前,所有这些都恢复到它们的原始状态)。

有人对这里有什么问题有任何建议吗?发生这种情况的任何其他可能原因?

感谢一切。

编辑 2013 年 9 月 10 日下午 1:06: 作为对 Alan Storm 检索 Standard.php 正在寻找的控制器名称的方法的响应,我收到了许多“丢失”的控制器文件。但是,在下载 1.7.0.2 的新副本以查找这些文件后,它们都不存在于其中。这是我在 Standard.php 中 Alan 的 var_dump 建议的输出:

  • ..."/public_html/app/code/core/Mage/Index/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/Paygate/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/Paypal/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/Widget/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/Oauth/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/Authorize Net/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/Bundle/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/Centinel/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/Compiler/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/Connect/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/Downloadable/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/ImportExport/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/Api 2/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/PageCache/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/XmlConnect/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/Adminhtml/controllers/Controller.php"

  • ..."/public_html/app/code/community/Phoenix/Moneybookers/controllers/Controller.php"

  • ..."/public_html/app/code/core/Mage/Captcha/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/CurrencySymbol/controllers/Adminhtml/Controller.php"

  • ..."/public_html/app/code/core/Mage/货币符号/controllers/Adminhtml/IndexController.php"

** 2013 年 9 月 10 日下午 3:39 已解决:** 好的,虽然很直接,但已修复。我将 Alan Storm 的 var_dump 建议的输出视为我在核心代码池的某处创建了一个错误(这不是我打算做的事情,而是使用默认代码)。不幸的是,为了准确学习,我将其全部替换为默认的核心代码池 1.7.0.2。这是在艾伦用我从未调查过的更多建议更新他的原始答案之前完成的。谢谢艾伦,你很酷。

解答

无路由 404 错误通常表明 Magento 找不到它认为应该加载的控制器文件(通常是由于配置错误)

最简单的诊断方法是跳到_validateControllerClassName

#File: app/code/core/Mage/Core/Controller/Varien/Router/Standard.php
protected function _validateControllerClassName($realModule, $controller)
{
    $controllerFileName = $this->getControllerFileName($realModule, $controller);

    if (!$this->validateControllerFileName($controllerFileName)) {  
        return false;
    }

    $controllerClassName = $this->getControllerClassName($realModule, $controller);
    if (!$controllerClassName) {
        return false;
    }

    // include controller file if needed
    if (!$this->_includeControllerClass($controllerFileName, $controllerClassName)) {
        return false;
    }

    return $controllerClassName;
}

并在返回false语句周围删除一些日志记录或var_dumps。这应该会告诉您 Magento 正在寻找哪些文件而找不到 - 通常足以指出问题所在。

    if (!$this->validateControllerFileName($controllerFileName)) {  
        var_dump($controllerFileName);
        return false;
    }

    $controllerClassName = $this->getControllerClassName($realModule, $controller);
    if (!$controllerClassName) {
        var_dump($controllerClassName);
        return false;
    }

    // include controller file if needed
    if (!$this->_includeControllerClass($controllerFileName, $controllerClassName)) {
        var_dump("Couldn't include: $controllerFileName");
        return false;
    }

更新:Magento 在多个位置查找控制器文件是正常的——每个注册为包含 adminhtml 控制器文件的模块都需要检查。

但是,几乎所有正在查找的控制器文件都命名为/Controller.php。对于默认的/admin索引页,这应该是IndexController.php。这让我觉得你的系统认为它应该寻找一个名称为空的控制器,(可能是因为/admin(而不是admin/index)是你正在使用的 URL 的默认控制器值)

发生这种情况的原因有很多——很多都是围绕核心文件被更改或模块中的配置节点设置为错误值。如果下面的解决方案对您不起作用,您需要尝试区分您的代码库与干净的代码库,禁用每个自定义模块,如果修复问题会重新打开模块,直到找到问题模块,或者潜水深入调试 Magento 路由代码,找出系统不满意的原因。

此行为的一个常见原因是为自定义管理路径设置了无效值(或根本没有值)

System -> Configuration -> Admin -> Admin Base URL -> Use Custom Admin Path

如果“自定义管理路径”的值为空白,或者包含和附加/,这可能会干扰路由。

由于您无法访问管理员,请尝试运行以下 SQL 查询

select * from core_config_data where path like '%custom_path%';    
...
292 default 0   admin/url/use_custom_path   1
293 default 0   admin/url/custom_path   admin/

如果您看到与上述类似的结果,或者admin/url/custom_path是空白/不存在但admin/url/use_custom_path仍然是1- 那么这就是您的问题。

尝试从core_config_data中删除这些配置值 (admin/url/use_custom_path) 和 (admin/url/use_custom_path)。

如果这不适用于您的系统,根据我的空白控制器理论,我最好的猜测是 _ 出于某种未知原因 _ 代码位于

#File: app/code/core/Mage/Core/Controller/Varien/Router/Admin.php
public function fetchDefault()
{
    // set defaults
    $d = explode('/', $this->_getDefaultPath());
    $this->getFront()->setDefault(array(
        'module'     => !empty($d[0]) ? $d[0] : '',
        'controller' => !empty($d[1]) ? $d[1] : 'index',
        'action'     => !empty($d[2]) ? $d[2] : 'index'
    ));
}

正在使用空白值填充controller键。

Logo

华为、百度、京东云现已入驻,来创建你的专属开发者社区吧!

更多推荐