【问题标题】:Magento 404 on Admin Page管理页面上的 Magento 404
【发布时间】:2013-09-10 17:07:38
【问题描述】:

大约一周前,我在一个新站点的测试环境中工作。我离开了一个小时,回来了,现在无法进入管理页面,因为在“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/fix-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/Authorizenet/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/Api2/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/CurrencySymbol/controllers/Adminhtml/IndexController.php"

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

【问题讨论】:

  • 不,它没有。我正要补充一点,文件“app/etc/use_cache.ser”对我来说不存在。该查询不执行任何操作,因为所有这些列设置都已为“0”。
  • 哪个 Magento 404 页面?有很多,每一个都有不同的原因alanstorm.com/magentos_many_404_pages
  • @AlanStorm,我得到了 No Route 404。
  • 在 Magento 中不需要修改核心文件,而是用你自己的类扩展核心类。

标签: php magento http-status-code-404 admin


【解决方案1】:

没有路由 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 键。

【讨论】:

  • 感谢 Alan,它输出了许多控制器路径。但是,在下载了 1.7.0.2 的另一个副本后,我也无法在新副本中找到这些文件。我已将我的输出放在对原始问题的编辑中。有什么建议吗?
  • 在我头上,Magento 在多个地方查找控制器文件是正常的——每个注册为包含 adminhtml 控制器文件的模块都需要检查。但是,几乎所有正在查找的控制器文件都被命名为/Controller.php。对于默认的/admin 索引页,这应该是IndexController.php。这让我觉得你的系统认为它应该寻找一个名称为空白的控制器。稍后我可能对此有更多想法 - 希望能帮助您找到它。
  • @ooblek6000 在上面的更新中添加了一些额外的想法。祝你好运!
  • 感谢伟大的调试技巧
  • 真的很有帮助。我正在开发一个不区分大小写的操作系统,但我们生产环境中的操作系统是区分大小写的。通过这段代码,我可以看到 Magento 正在寻找 MvreportController.php 而存在的文件是 MVReportController.php
【解决方案2】:

就我而言,我的管理员给了我 404,因为没有设置商店。 我通过运行以下查询解决了它

SET SQL_SAFE_UPDATES=0;
SET FOREIGN_KEY_CHECKS=0;
UPDATE `core_store` SET store_id = 0 WHERE code='admin';
UPDATE `core_store_group` SET group_id = 0 WHERE name='Default';
UPDATE `core_website` SET website_id = 0 WHERE code='admin';
UPDATE `customer_group` SET customer_group_id = 0 WHERE customer_group_code='NOT LOGGED IN';
SET FOREIGN_KEY_CHECKS=1;
SET SQL_SAFE_UPDATES=1;

您可以检查是否在 var/log/system.log 中记录了以下错误

ERR (3):可恢复错误:传递给 Mage_Core_Model_Store::setWebsite() 的参数 1 必须是 Mage_Core_Model_Website 的实例,给定 null,在 /.../app/code/core/Mage/Core/Model/ 中调用App.php 在第 634 行,并在第 395 行的 /.../app/code/core/Mage/Core/Model/Store.php 中定义

【讨论】:

    【解决方案3】:

    在进行任何操作之前,请检查您的配置文件 (app/etc/local.xml) 并确保您将“admin”作为 frontName 标记的值。 例如:

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

    通常当您尝试http://yoursite.com/admin 时,它会为您提供管理区域 尝试使用类似http://yoursite.com/index.php/admin 的网址 如果它有效,您可能只需要修改重写规则或遵循建议(见下面的链接)

    【讨论】:

      【解决方案4】:

      我在具有自定义管理网址 www.shop.com/customadminroute/ 和系统 -> 配置 -> 网站 -> URL 选项 -> 将商店代码添加到网址:已启用的商店中遇到了这个问题

      在这种情况下,下面的模块应该修复它:

      https://github.com/romfr/404adminlogin

      感谢 Carmen Bremen 的博文:

      http://neoshops.de/2012/09/07/magento-404-fehlerseite-beim-admin-login/

      【讨论】: