アルファサード株式会社 代表取締役 野田 純生のブログ


MTでアーカイブマップング変更時、又はサイトリニューアル時のリダイレクト指定の裏技


公開日 : 2014-05-07 21:25:10


URLが変わらないのがもちろん一番なんですけどね。変わってしまうとき、URLのリダイレクト設定をしなければならないことがあります。

旅行ブログ、ノーマルブログの「ブログ記事」「ブログ記事一覧(カテゴリー)」のアーカイブマッピングを変更しました。

そのため、テーマを更新するとブログ記事ページとカテゴリーページのURLが変わります。旧URLから新URLへリダイレクトさせるテンプレートを用意しました。

プラグインを書いてダイナミックパブリッシングエラーテンプレートを利用する

.htaccessでリダイレクトする例が紹介されています。これはこれでいいのですが、.htaccessの場合、すべてのリクエストに対して処理が入るので、ちょっとでも負荷を減らしたいという時の裏技? として、ダイナミックパブリッシングエラーテンプレートを使う方法をご紹介します。

以下のファイルを用意します。

plugins/MyRedirect/php/function.mtmyredirect.php

ダイナミックパブリッシングエラーテンプレートの先頭に、以下のようにタグを記述します。

<mt:MyRedirect>

# <mt:MyRedirect>は存在しません、とか言われますが気にしなくていいです。
# スタティック用のタグがないだけで、ちゃんとこれで動作するので。

DynamicMTMLが有効なら、エラーページのURLを簡単に得る方法があるのですが、そうでなければ以下のようなテンプレートにして、エラーメッセージからパスを取得しても良いでしょう。

<mt:ErrorMessage setvar="error_message">
<mt:MyRedirect error="$error_message">

function.mtmyredirect.php の内容は以下のような感じです。

stash( 'bootstrapper' ); // DynamicMTMLが有効なら // $app->url; // $app->request; $error = $args[ 'error' ]; // DynamicMTML無効なとき、横着してパスを得る $url = preg_replace( "/([-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+).*$/", "$1", $error ); // リダイレクト処理 if ( $new_url ) { // パターンにマッチしたら header( 'Status: 301 Moved Permanently' ); header( 'Location: ' . $new_url ); exit(); } } ?>

データベースにアクセスしてリダイレクト対象かをチェックしてもいいですが、テンプレートで、CSVやJSONを吐いておいて、リダイレクトの対象かどうかを見るようなやり方がお勧めです。

.htaccessを用いる方法と比較すると、ページが見つからない時だけ処理されますので、全てのリクエストに処理が走る方法と比較すると負荷の面でお勧めです。但し、このPHPの処理自体が重い処理になってしまうと本末転倒ですので、必要に応じて使い分けてください。

また、リダイレクト先が存在しない場合、無限ループになったりしないよう、ページの存在チェックを入れることをお勧めします。



このブログを書いている人
野田純生の写真
野田 純生 (のだ すみお)

大阪府出身。ウェブアクセシビリティエバンジェリスト。 アルファサード株式会社の代表取締役社長であり、現役のプログラマ。経営理念は「テクノロジーによって顧客とパートナーに寄り添い、ウェブを良くする」。 プロフィール詳細へ