6

We recently upgraded from 1.10 to 1.13 and are having some problems with our home page. All other cms pages are functioning properly, but the home page is consistently returning a cms 404. It doesn't matter which cms page we choose to be the home page, it always returns 404.

The store view is properly set, the homepage 'url' is set to cms, and i can't find any entries in core_url_rewrite with an empty request_path field.

Everything worked fine in our dev environment.

As a stop gap fix until we find a real solution, we have magento's 404 page set to load the cms page that is supposed to be used in the actual home page. Users don't notice a difference, but the home page of our site is still technically throwing a 404.

Any thoughts on what is going on here?

EDIT

The culprit was a product with an empty url key. Up until now, there were some cases in our product upload workflow where a product would get added to magento from our erp before it has a name. The url key is generated based on the product name, so these products have no url key. In 1.10 this apparently wasn't a problem. 1.13 however, treats that as though we entered the document root as the url key. Since Product url redirects supersede cms redirects, magento was trying to point to this product. It was returning 404 because the product was marked as 'not visible individually'.

  • There are really lots of articles all over Internet about this issue. It will be a shame to repost them here. – user487772 May 24 '13 at 19:12
  • Thank you for your constructive criticism. I'm sorry I wasn't clear enough in my question. I have tried the solutions given in articles and forum posts that i have found. None of what I have found so far seems to be working. Potential causes that I have found so far are: 1: store view of the home cms page not properly set 2: The url for the home page not being set to 'cms' 3: a rogue entry in the cor_url_rewrite table with an empty request_path field I guess I'm failing at finding that magic article with my answer. Sorry. – amishbot May 24 '13 at 19:28
  • 1
    Which 404 page are you seeing? Magento has a few different 404 pages cause by different conditions in the system. (alanstorm.com/magentos_many_404_pages) – Alan Storm May 24 '13 at 19:40
  • Have you also tried modifying Mage::run in index.php? – user487772 May 24 '13 at 19:45
  • It is a no route 404. We are Customizing the cms/index/noroute to use the home page's cms as a hacky workaround until we find a solution. – amishbot May 24 '13 at 19:49
11

You're not going to get out of this without a little debugging. The following applies to Magento CE, but should be relevant for Magento EE. Also, this post summarizes a lot of material found in my Magento Dispatch series. If you want to really engage in some bottom up debugging, start there.

To start, most of the Magento problems I see boil down to "I was really sure this one thing was X, but it was actually Y". Even if you're absolutely sure about something I tell you to check, make sure you actually check it.

The routing for Magento's homepage is handled by the Mage_Core_Controller_Varien_Router_Standard object. The first key part is this line

#File: app/code/core/Mage/Core/Controller/Varien/Router/Standard.php

$p = explode('/', $this->_getDefaultPath());

The _getDefaultPath method looks at your Magento store config for the set value.

protected function _getDefaultPath()
{
    return Mage::getStoreConfig('web/default/front');
}

which is the configuration that corresponds to

System -> Configuration -> Web -> Default Pages -> Default Web URL

Tripple check that this value is set to the string

`cms`

and that your core_config_data table

select * from core_config_data where path = 'web/default/front';

doesn't contain any unexpected scoped values.

Once you've done the above, add some temporary debugging code to peek at the value of $p after that call.

$p = explode('/', $this->_getDefaultPath());
var_dump($p);
//or
Mage::Log($p);
//or
file_put_contents('/tmp/test.log',"$p\n",FILE_APPEND);

You should see output something like this

array (size=1)
    0 => string '' (length=0)

array (size=1)
    0 => string 'cms' (length=3)

The reason you have two items being dumped/logged is the match method is shared between the admin router and the standard router object. If the second item isn't a one element array with cms, that's your problem. Figure out what that's not happening, and you'll be on your way to solving the problem.

Assuming that's not the problem, Magento should now dispatch to the indexAction method in the IndexController.php file in the Mage_Cms module. Ensure this is the case by adding the following two lines to the start of indexAction

#File: app/code/core/Mage/Cms/controllers/IndexController.php
public function indexAction($coreRoute = null)
{
    $pageId = Mage::getStoreConfig(Mage_Cms_Helper_Page::XML_PATH_HOME_PAGE);
    if (!Mage::helper('cms/page')->renderPage($this, $pageId)) {
        $this->_forward('defaultIndex');
    }
}

You should see Mage_Cms_IndexController::indexAction dumped to the browser window. If this doesn't happen, then there's something about your system that's preventing standard routing from being used — jump back up into the match method and figure out why $controller, $controllerClassName, $controllerInstance, and $action variables don't point to the indexAction method in the IndexController.php file in the Mage_Cms module. (If this is the case, say so in the comments and I'll provide an update debugging scanrio for this)

Assuming you are being routed to this controller file and action correctly, remove the

var_dump(__METHOD__);
exit;

and instead add a new var_dump

$pageId = Mage::getStoreConfig(Mage_Cms_Helper_Page::XML_PATH_HOME_PAGE);    
var_dump($pageId);  

Magento allows you to configure the identifier of the page that should be used as the home page. The Mage_Cms_Helper_Page::XML_PATH_HOME_PAGE should corresponds with the store config path web/default/cms_home_page, which corresponds with the

System -> Configuration -> Web -> Default Pages -> CMS Home Page

section. This is where you tell Magento which CMS page you want to use as your homepage. You should see something like

string 'home' (length=4)

or

string 'about-magento-demo-store' (length=4) 

or etc. dumped to your screen. This is the CMS home page identifier. If you're setting an unexpected value, try running the following

select * from core_config_data where path = 'web/default/cms_home_page';

to check for scoped values. Regardless of what you CMS Home Page ID is, check for the page's existence with the following SQL statement (assuming a value of home).

select * from cms_page where identifier = 'home';

If Magento can't find the configured page in your system, it will forward to the 404 page. You can see that with the following code in indexAction

if (!Mage::helper('cms/page')->renderPage($this, $pageId)) {
    $this->_forward('defaultIndex');
}

If renderPage returns false, then we're forwarded to the defaultIndexAction method which renders the 404 page.

public function defaultIndexAction()
{
    $this->getResponse()->setHeader('HTTP/1.1','404 Not Found');
    $this->getResponse()->setHeader('Status','404 File not found');

    $this->loadLayout();
    $this->renderLayout();
}    

That should be enough to find 90% of your "no route to homepage" problems, and point you in a debugging direction for the other 10%.

  • 2
    The culprit was a product with an empty url key. Up until now, there were some cases in our product upload workflow where a product would get added to magento from our erp before it has a name. The url key is generated based on the product name, so these products have no url key. In 1.10 this apparently wasn't a problem. 1.13 however, treats that as though we entered the document root as the url key. Since Product url redirects supersede cms redirects, magento was trying to point to this product. It was returning 404 because the product was marked as 'not visible individually'. – amishbot May 28 '13 at 16:30
  • @amishbot Yikes! That's a pile of special right there. Glad you tracked it down. – Alan Storm May 28 '13 at 17:33
  • @amishbot I had the same issue with a blank redirect request path, if you could update your question just to show your solution it may be helpful for others – Luke Feb 2 '16 at 19:15
5

I ran into this same issue with an empty url key for an inactive category. It didn't pop up until I tested reindexing in EE 1.13.0.0 after the upgrade. Same deal, 404 on the home page.

I'm probably well oversimplifying Alan's detective work, but I ended up just querying the new enterprise_url_rewrite table for an empty request_path.

SELECT * FROM `enterprise_url_rewrite` WHERE request_path = '';

The matching target_path clued me in to the request that was hijacking the home page. Then, I fixed said category and all was well.

2

This is a known bug from Magento - The recommend running the following:

DELETE FROM enterprise_url_rewrite WHERE request_path = '';

In addition there are number of new scripts in the shell directory (Please read the release notes)

1

Probably this problem here.. Check your imported group ids http://blog.chapagain.com.np/magento-solution-to-error-404-not-found-in-admin-login-page/

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.