私は、404ページすべてに301のhttpステータスを返すように強制する任務を負っています。Webを検索/閲覧していますが、これを実現する方法に関する情報が見つかりません。
layout.xmlまたはテンプレートファイルのhttpステータスを変更する方法はありますか?そうでない場合は、どのコントローラーを見る必要がありますか?
私は、404ページすべてに301のhttpステータスを返すように強制する任務を負っています。Webを検索/閲覧していますが、これを実現する方法に関する情報が見つかりません。
layout.xmlまたはテンプレートファイルのhttpステータスを変更する方法はありますか?そうでない場合は、どのコントローラーを見る必要がありますか?
私はそれをあまり調べていませんが、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');
}**
上記の記事によると、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
Magentoには404ページがありますが、Alan Stormによるこの記事は、必要なものを見つけるのに役立つはずです。
私は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に変更するだけです。