Magento: Standard Weiterleitung mit 302 ändern zu einer 301 Weiterleitung (SEO)

17. Januar 2013 at 10:30

Magento leitet interne Links per 302-Status-Code weiter. Das ist in Bezug auf Suchmaschinenoptimierung nicht gerade optimal, besser wäre eine 301-Weiterleitung.

Um das zu ändern sollte beim Aufruf der Funktion „_redirect“ jeweils als zweiten Parameter der korrekte Status-code „301“ mit gegeben werden, da ansonsten der Default-Parameter „302“ verwendet wird.

Siehe: /app/code/core/Mage/Core/Controller/Response/Http.php :

/**
* Additionally check for session messages in several domains case
*
* @param string $url
* @param int $code
* @return Mage_Core_Controller_Response_Http
*/
public function setRedirect($url, $code = 302)
{
/**
* Use single transport object instance
*/
if (self::$_transportObject === null) {
self::$_transportObject = new Varien_Object;
}
self::$_transportObject->setUrl($url);
self::$_transportObject->setCode($code);
Mage::dispatchEvent('controller_response_redirect',
array('response' => $this, 'transport' => self::$_transportObject));
return parent::setRedirect(self::$_transportObject->getUrl(), self::$_transportObject->getCode());
}

Um das über ein Magento-Event zu lösen, geht wie folgt vor:

Erstellt ein neues Module und erweitert die config.xml mit folgendem xml-snippet, z.B. in der /app/code/local/Neuesmodul/Cms/etc/config.xml

<global>
<events>
<cms_controller_router_match_before>
<observers>
<Neuesmodul_Cms_observer_cmsControllerRouterMatchBefore>
<type>singleton</type>
<class>neuesmodul_cms/observer</class>
<method>
cmsControllerRouterMatchBefore
</method>
</Neuesmodul_Cms_observer_cmsControllerRouterMatchBefore>
</observers>
</cms_controller_router_match_before>
</events>
</global>

in /app/code/local/Neuesmodul/Cms/Model/Observer.php fügt ihr die folgende Funktion  ein:

/*
* set 301-Http-Response-Code for redirection
*/
public function cmsControllerRouterMatchBefore(Varien_Event_Observer $observer)
{
$condition = $observer->getEvent()->getCondition();
if ($condition->getRedirectUrl()) {
Mage::app()->getFrontController()->getResponse()
->setRedirect($condition->getRedirectUrl(), 301)
->sendResponse()
->setDispatched(true);
}
}

Alternativ-Funktion

/*
 * set 301-Http-Response-Code for redirection
 */
 public function cmsControllerRouterMatchBefore(Varien_Event_Observer $observer)
 {
 $condition = $observer->getEvent()->getCondition();
if ($condition->getIdentifier()) {
 Mage::app()->getFrontController()->getResponse()
 ->setRedirect('/', 301)
 ->sendResponse()
 ->setDispatched(true);
die();
 }
 }