3

私は、404ページすべてに301のhttpステータスを返すように強制する任務を負っています。Webを検索/閲覧していますが、これを実現する方法に関する情報が見つかりません。

layout.xmlまたはテンプレートファイルのhttpステータスを変更する方法はありますか?そうでない場合は、どのコントローラーを見る必要がありますか?

4

4 に答える 4

5

私はそれをあまり調べていませんが、404メッセージはこのファイルで送信されているようです-3つの関数で:

サーバーパス:/ app / code / core / Mage / Cms / controllers

ヘッダーを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');
}**
于 2012-11-13T19:29:38.197 に答える
3

上記の記事によると、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ヘッダー値を再度設定するために使用できる、という名前の3番目のパラメーターがあることがわかります。

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

ヘッダーの値を変更するには十分なはずです。フロントコントローラーが応答オブジェクトに出力を送信するように指示する前に、これを呼び出すだけです。おそらくphtmlテンプレートからこれを行うことができます(出力は送信される前にレンダリングされるため)が、より良い方法は、2つのCMSのルートなしアクションのイベントリスナーを使用することです(ルートなしのカスタムアクションを設定した場合) 、それに応じて調整します)

controller_action_postdispatch_cms_index_noRoute
controller_action_postdispatch_cms_index_defaultNoRoute
于 2012-05-30T17:36:30.157 に答える
2

Magentoには404ページがありますが、Alan Stormによるこの記事は、必要なものを見つけるのに役立つはずです。

http://alanstorm.com/magentos_many_404_pages

于 2012-05-30T13:54:08.833 に答える
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]-> [デフォルトページ])を新しいモジュールのURLに変更するだけです。

于 2012-05-30T18:07:27.973 に答える