既に削除されたページ、存在しないURLが指定された時に表示するのが404ページです。Joomla!の場合、標準で次の様なページが表示されます。
検索モジュールの準備
404ページへ埋め込む検索モジュールを用意します。検索モジュールを作成(またはコピー)し、「有効」を「はい」に、「配置」にはテンプレートに存在しないポジション名を入力します。ここでは「404search」にしました。
404ページの作成
通常の記事を作成するように404ページを作成します。WYSIWYGエディタを使用して自由に編集して構いません。先ほど作成した検索モジュールを読み込むため、loadpositionタグを文末に記述します。セクションを「未分類」、カテゴリを「未分類」にして保存して下さい。
404ページへリンクするメニューアイテムの作成
上記で作成した404記事へリンクするためのメニューアイテムを作成します。このメニューアイテムは非公開にするため、作成するメニューはどこでも構いません(例えばメインメニューなど)。
メニューアイテム作成画面から「新規」→「記事」→「スタンダード記事レイアウト」を選択します。
タイトルやエイリアス(別名)を入力し、公開を「いいえ」に設定します。
先ほど作成した記事を選択したら「適用」をクリックします。
次に「リンク」の欄に表示されたURLをコピーします。このURLは後で必要になりますので、メモ帳などに貼り付けておくと良いでしょう。
エラーページのオーバーライド
Joomla!では存在しないURLが指定された場合、/templates/system/error.phpファイルを返す仕組みになっています。このファイルをテンプレート側でオーバーライドして利用します。
/templates/system/error.phpを使用中のテンプレートディレクトリ直下にコピーして下さい(/templates/テンプレート名/error.phpとなるように)。
error.phpの編集
2009/12/01追記 以前記載していたfile_get_contents関数を使用した方法は、PHP設定のallow_url_fopenがONでないと使用できません。またallow_url_fopenをONにした場合セキュリティ上のリスクがあるため、cURL関数を使用した方法に修正しました。問題があればご指摘ください。
コピーしたerror.phpファイルを開き、13行目付近を次の様に編集します。
編集前
defined( '_JEXEC' ) or die( 'Restricted access' );
?>
編集後(2009/12/01修正)
defined( '_JEXEC' ) or die( 'Restricted access' );
if (($this->error->code) == '404') {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, JURI::root().'上記でコピーしたURL');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
} else {
?>
「上記でコピーしたURL」の部分は、先ほどコピーしておいたURLと置き換えて下さい。
また最終行へ以下の様に追加します。
編集前
</body>
</html>
編集後
</body>
</html>
}
?>
ちなみに・・・
- SEFコンポーネント(sh404sef、JoomSEF、AceSEFなど)を利用すると、こんな面倒な事をしなくても同じ事ができます。
- FirefoxのLive HTTP Headersでステータスコードを確認すると、正しく404を返しているようですがその後の文字列が文字化けしています。なんでだろう?問題はなさそうなので様子見です。
タグ: カスタマイズ