sitemap.xmlを使って『ちょっと便利で優しい404ページ』
以前書いた PHPで作る『ちょっと便利で優しい404ページ』 を、sitemap.xmlを使ってもっと簡単に実装したいと思います。
サイトマップの再利用アイデアは404エラーページに似ているURLを表示させるためのテンプレット | チバのブログから。(こちらはROR形式サイトマップでの実装)
※ナイスなタイミングでGoogleから404ページ関連のサービス(カスタム 404 ページ)が提供されてますが、気にせずPHPで実装したいと思います。
ダウンロード
より簡単に使用できるように、ファイルをダウンロード出来るようにしました。
ソースコード
maybeURL.php
<?php
/**
* もしかしてお探しのページは [URL] ではありませんか?
*
* @param string $sitemap サイトマップファイル
* @return string 最も近い実在URL
*/
function maybeURL($sitemap)
{
// サイトマップ読み込み
$data = file_get_contents($sitemap);
// URLを抜き出す正規表現
$pattern = '/<loc>http:\/\/[^\/]*(.*)<\/loc>/';
// $urlList[1]にURLリストが入る
preg_match_all($pattern, $data, $urlList);
// 最短距離の初期値
$shortest = -1;
// 最も近い実在URLを探し始める
foreach ($urlList[1] as $val) {
// リクエストURLとリストURLの距離を計算する
$lev = levenshtein($_SERVER['REQUEST_URI'], $val);
// 二つの距離が0(同一文字列)なら終了
if ($lev === 0) {
$existURL = $val;
$shortest = 0;
break;
}
// 二つの距離が最短距離よりも短いか、
// 最短距離が初期値の場合、最短距離書き換え
if ($lev <= $shortest || $shortest < 0) {
$existURL = $val;
$shortest = $lev;
}
}
// 最も近い実在URL
return $existURL;
}
必要な値がURLだけだったので、XMLとして評価せず、正規表現を使ってURLを取得しています。と言うかSimpleXmlElement遅すぎ。
URLを取得する正規表現で『http://ホスト名』の部分を除外しています。除外不要の場合は、$patternのhttp:\/\/[^\/]*を削除して下さい。
404.php
<?php
require_once 'maybeURL.php';
$url = maybeURL('./sitemap.xml');
?>
<!-- ヘッダー -->
<h1>404 指定されたページは存在しません</h1>
<h2>もしかして</h2>
<p>お探しのページは <a href="<?php echo $url; ?>"><?php echo $url; ?></a> ではありませんか?</p>
<!-- フッター -->
前のとほぼ同じです。
使用方法
- 404.php を 404ページとして利用できるように設定する。
- 404.phpのサイトマップやmaybeURL.phpのパスを編集する。
- 後は表示部分を適当に編集すれば直ぐに使えます。
※サイトマップの指定はフルパス,相対パス,URLのいずれかで行って下さい。