Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
394 views
in Technique[技术] by (71.8m points)

php - Magento 404 on Admin Page

About a week ago, I was working in a test environment for a new site. I left for an hour, came back, and now cannot get to the admin page, as in ‘http://magento.localhost.com/admin’ results in a No Route 404. I am the only one with access to this, it is not live in any sense. I am using VBox with Ubuntu to host the environment. In terms of possible fixes, so far I have tried…

  • Making sure core_store, core_store_group, core_website, and customer_group table ids are set to 0 (as described in this and many other articles - http://www.nude-webdesign.com/fix-for-magento-admin-error-404-page-not-found/)

  • Playing with the /app/code/core/Mage/Core/Controller/Varien/Front.php method _isAdminFrontNameMatched to display the adminPath (it’s ‘admin’)

  • Cleared the var folder, emptied browser cache. Site’s caching was and is turned off.

  • Adding 'index.php' to the url still results in a 404.

  • As per Magento Admin 404, the file 'app/etc/use_cache.ser' doesn't exist for me.

On the day of this occurring, I was simply playing around with some layout files I had copied to a module I made and the theme’s media queries (all of which were reverted to their original state even before this problem started to occur).

Does anyone have any suggestions as to what is wrong here? Any other possible reasons this could be happening?

Thanks for anything.

EDIT 1:06pm 9/10/2013: In response to Alan Storm's method of retrieving controller names that Standard.php is looking for, I was returned many "missing" controller files. However, after downloading a fresh copy of 1.7.0.2 to find those files, they weren't present in their either. Here is my output from Alan's var_dump suggestion in Standard.php:

  • ..."/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"

Resolved 3:39pm 9/10/2013: Ok, it's fixed albeit rather bluntly. I took the output of Alan Storm's var_dump suggestion to mean I had created an error somewhere in the core code pool (which is not something I intended on doing, screwing with the default code that is). Unfortunately for sake of exact learning, I then replaced it all with the default core code pool of 1.7.0.2. This was done before Alan updated his original answer with more suggestions that I never investigated. Thanks Alan, you're rad.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

A no route 404 error usually indicates Magento can't find the controller file it thinks it should load (usually due to a misconfiguration)

The easiest way to diagnose this is to hop to _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;
}

and drop some logging or var_dumps around the return false statments. This should tell you which files Magento is looking for and can't find — it's usually enough to point to the problem.

    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;
    }

Update: It's normal for Magento look for the controller file in multiple places —?every module that registered as containing adminhtml controller files needs to be checked.

However, almost all the controller files being looked for are named /Controller.php. For the default /admin index page this should be IndexController.php. This makes me think your system thinks it's supposed to look for a controller with a blank name, (likely the default controller value since /admin (and not admin/index) is the URL you're using)

There's myriad reasons this could happen —?many revolving around a core file being changed or a configuration node in a module set to the wrong value. If the solutions below don't work for you you'll need to try diff-ing your code base vs. a clean one, disabling every custom module and if that fixing things turn modules back on until the problem module is found, or dive deep into debugging Magento routing code to figure out why your system is unhappy.

One common cause for this behavior is an invalid value (or no value at all) being set for a custom admin path at

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

If the value for "custom admin path" is blank, or contains and additional /, this could be interfering with the routing.

Since you can't access the admin, try running the following SQL query

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/

If you see results similar to the above, or admin/url/custom_path is blank/not-present but admin/url/use_custom_path is still 1 — then that's your problem.

Try deleting these configuration values (admin/url/use_custom_path) and (admin/url/use_custom_path) from core_config_data.

If that doesn't apply to your system, per my blank controller theroy my best guess would be for some unknown reason the code at

#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'
    ));
}

is populating the controller key with a blank value.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...