强制Magento没有路由返回状态301而不是404

时间:2012-05-30 13:36:50

标签: php magento http-status-code-301 http-status-codes

我的任务是强制所有404页面返回http状态301.我一直在网上搜索/阅读,但我找不到任何有关如何完成此操作的信息。

有没有办法更改layout.xml或模板文件中的http状态?如果没有,我应该看看什么控制器?

4 个答案:

答案 0 :(得分:5)

我没有太多关注它,但404消息似乎是在这个文件中发送的 - 在3个函数中:

服务器路径: /应用程序/代码/核心/法师/ CMS /控制器

我将标头从404更改为301重定向。可能不是最琐碎的解决方案,但似乎有效。

**/**
 * Default index action (with 404 Not Found headers)
 * Used if default page don't configure or available
 *
 */
public function defaultIndexAction()
{
    $this->getResponse()->setHeader('HTTP/1.1, 301 Moved Permanently');
    $this->getResponse()->setHeader('Location','http://www.streetcred.dk');
}
/**
 * Render CMS 404 Not found page
 *
 * @param string $coreRoute
 */
public function noRouteAction($coreRoute = null)
{
    $this->getResponse()->setHeader('HTTP/1.1, 301 Moved Permanently');
    $this->getResponse()->setHeader('Location','http://www.streetcred.dk');
}
/**
 * Default no route page action
 * Used if no route page don't configure or available
 *
 */
public function defaultNoRouteAction()
{
    $this->getResponse()->setHeader('HTTP/1.1, 301 Moved Permanently');
    $this->getResponse()->setHeader('Location','http://www.streetcred.dk');
}**

答案 1 :(得分:3)

根据上面提到的article,CMS无路由页面(或defaultNoRoute操作)都使用以下代码从控制器操作设置其404标头

$this->getResponse()->setHeader('HTTP/1.1','404 Not Found');

如果您查看setHeader

的方法定义
#File: lib/Zend/Controller/Response/Abstract.php
public function setHeader($name, $value, $replace = false)
{
    $this->canSendHeaders(true);
    $name  = $this->_normalizeHeader($name);
    $value = (string) $value;

    if ($replace) {
        foreach ($this->_headers as $key => $header) {
            if ($name == $header['name']) {
                unset($this->_headers[$key]);
            }
        }
    }

    $this->_headers[] = array(
        'name'    => $name,
        'value'   => $value,
        'replace' => $replace
    );

    return $this;
}

你可以看到有一个名为$replace的第三个参数,你可以用它再次设置一个标题值,所以像这样

Mage::app()->getResponse()->setHeader('HTTP/1.1','...header text...',true);

应足以更改标头的值。只需在前端控制器告诉响应对象发送其输出之前调用它。您可以从phtml模板执行此操作(因为输出在发送之前呈现),但更好的方法是使用两个CMS的事件侦听器无路由操作(如果您为无路由设置了自定义操作,相应调整)

controller_action_postdispatch_cms_index_noRoute
controller_action_postdispatch_cms_index_defaultNoRoute

答案 2 :(得分:2)

Magento有404个页面,Alan Storm的这篇文章可以帮助你找到你需要的东西:

http://alanstorm.com/magentos_many_404_pages

答案 3 :(得分:1)

我最后通过3个步骤完成了这项工作:

首先,我创建了一个新的cms页面(404 /登陆),并从我的404页面复制了所有cms设置。这是我将用户重定向到的页面。

然后我创建了一个新模块(您可以使用Alan Storm http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-3-magento-controller-dispatch的这个伟大指南)并使用以下操作:

public function indexAction() {
    $url = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB)."404/landing"; //build url
    $this->getResponse()->setRedirect($url, $code = 301); //set a redirect using Zend response object
}

一旦我的模块和登录页面正常工作,我就简单地将默认无路由URL(系统 - >配置 - > Web - >默认页面)更改为我的新模块。