Rewish

ウェブデザイン、HTML、CSS、JavaScript、PHP、WordPress、Movable Typeなど、Web制作で役立つかも知れないBlog.

Search

Entry Search

sitemap.xmlを使って『ちょっと便利で優しい404ページ』

カテゴリー
PHP/MySQL
タグ
Download, HTTP, URL, Usability

以前書いた PHPで作る『ちょっと便利で優しい404ページ』 を、sitemap.xmlを使ってもっと簡単に実装したいと思います。

サイトマップの再利用アイデアは404エラーページに似ているURLを表示させるためのテンプレット | チバのブログから。(こちらはROR形式サイトマップでの実装)

※ナイスなタイミングでGoogleから404ページ関連のサービス(カスタム 404 ページ)が提供されてますが、気にせずPHPで実装したいと思います。

ダウンロード

より簡単に使用できるように、ファイルをダウンロード出来るようにしました。

maybeURL.zip - v1.0

ソースコード

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>
<!-- フッター -->

前のとほぼ同じです。

使用方法

  1. 404.php を 404ページとして利用できるように設定する。
  2. 404.phpのサイトマップやmaybeURL.phpのパスを編集する。
  3. 後は表示部分を適当に編集すれば直ぐに使えます。

※サイトマップの指定はフルパス,相対パス,URLのいずれかで行って下さい。