トップ » 技術記事 » オリジナル Wiki を作ってみよう!(4) - URLを工夫しよう

オリジナル Wiki を作ってみよう!(4) - URLを工夫しよう

タグ: PHP Wiki

PHP を用いて Wiki アプリケーションを作る手順を解説しています。今回は、mod_rewrite や PATH_INFO を利用して、Wiki の各ページに割り振っている URL を工夫する方法を紹介します。動的なページを静的に見せることによって、検索エンジンに登録されやすくなり、SEO対策にも役立ちます。

前回までのおさらい

第1回目では、Wiki とは何か、どうして Wiki を作ることにしたのか、どんな Wiki を作るのかということを考えてみました。そして、KonaWiki という名前の Wiki を作ることに決めました。

第2回目では、手軽にPHPのテスト環境が揃えることが可能なXAMPPを利用して、開発環境を構築してみました。そして、恥ずかしながら、開発途中の KonaWiki を見てもらいました。

第3回目では、KonaWikiのWikiパーサの仕組みを紹介しました。Wiki 記法のテキストを、文法に沿って HTML に変換する手順と、Wikiパーサを自作せず、既存ライブラリを使う方方があることも紹介しました。

Wiki の URL を工夫してみよう

今回は、Wiki の各ページを表すURLについて考察し、その実現方法を紹介します。通常 Wiki では、URL の中にページの名前を直接記述することで、その名前を持つページを表示できるようになっています。例えば、FrontPage という名前のページを表示する場合、Wiki のスクリプトに続けて、FrontPage のような形になっています。

http://(Wikiスクリプト名など)FrontPage

もちろん、KonaWikiでも、ページの名前を URL に記述することで、期待するページを表示できるようにしています。加えて、設定を変更することによって Wiki の各ページのURLの表現方法を変えることができるようにしています。では、どんな形で表現できるようになっているのか、1つずつ見ていきましょう。

Wiki のページ名を、GET パラメータで表す方法

まず1つ目は、通常の PHP に GET でパラメータを与える方法です。これは、次のような形式になっています。

index.php?p=FrontPage

index.php が PHP のスクリプトで「?」以降がPHPに渡される引数です。ここでは、引数が「?p=FrontPage」となっており、「FrontPage」というページを表示することを表しています。また、この「FrontPage」を編集する場合には「index.php?p=FrontPage&=edit」という引数を与えることにしました。これは、PHP に GETメソッドでパラメータを与える一般的な方法で、PHP を含む Perl などの CGI でも利用される方法です。

例えば、http://example.com というサイトに Wiki を設置した場合には、次のような URL でアクセスすることになるでしょう。

http://example.com/konawiki/index.php?p=FrontPage

そして、Wikiに訪れるユーザーが「八角」というページを見たいと思ったら、p= の後を「八角」に書き換えることで、「八角」のページを見ることができます。或いは、日本語が八角をURLエンコードした形になるでしょう。

http://example.com/konawiki/index.php?p=八角
http://example.com/konawiki/index.php?p=%E5%85%AB%E8%A7%92

このページ表現の方法は、特に何の工夫もなく、「?」以降にパラメータがついていることで、動的なページであると判断され、検索エンジンの検索対象として追加されにくくなるという欠点があります。せっかく有益な情報があるのに、検索対象から外れるのは非常にもったいないことです。そこで、静的に見える工夫をしてみます。

「mod_rewrite」を使う方法

Apache のモジュール「mod_rewrite」を使うことで、動的なページを静的なページに見せかけることができます。mod_rewriteとは、アクセスするURLを正規表現で書き換えるという働きをします。設定として書き換えるべきルールを与えることで、URL の書き換えを行うことができます。

では、上記のようにGETパラメータのある動的な Wiki ページを、mod_rewrite を利用して静的に見せかけてみましょう。このとき、動的なページを構成するためのGETパラメータを何とかして、静的なページとして見せかけるための工夫が必要となります。

単純なパラメータだけならば、「/konawiki/index.php?p=XXX」を「/konawiki/XXX.html」のように、HTMLページとして見せかけることもできますし、複数のパラメータが存在するなら、拡張子をつけるのではなく、ディレクトリとして見せかける方法もあります。

KonaWiki でも、「mod_rewrite」を使って、FrontPage を表示する場合、ディレクトリのような形式を用いてアクセスできるようにしました。つまり、konawiki 以下のディレクトリ名が、表示するページの名前となっているのです。

[アクセスするURL]
http://example.com/konawiki/FrontPage/
[書き換えられて実行されるURL]
http://example.com/konawiki/index.php?p=FrontPage

「mod_rewrite」を使うには、Apache に mod_rewrite を使うことを指示する必要があります。前々回、紹介した PHP の開発環境をインストーラー形式でセットアップできる、XAMPP をインストールしている方は、次の方法で、mod_rewrite が使えるようになります。

XAMPPには、はじめから、mod_rewrite が入っていますが、使えないような設定になっています。そこで、mod_rewrite が利用できるように、Apacheの設定ファイルを書き換えます。

XAMPPのコントロールパネルから、エクスプローラーを起動します。そして、/apache/conf/httpd.conf を開きます。そして、mod_rewrite が記述されている行を探して、コメントアウトされている行のコメントをはずします。

(修正前)
#LoadModule rewrite_module modules/mod_rewrite.so
   ↓
(修正後)
LoadModule rewrite_module modules/mod_rewrite.so

設定を書き換えて、Apache を再起動したら、mod_rewrite が使えるようになります。そして、実際に書き換えのルールを記述するには、.htaccess というファイルに、書き換えルールを指定します。(「.htaccess」も、Apache の設定を行うためのファイルです。)

以下に簡単な書き換えルールを設定してみました。これは「http://example.com/konawiki/FrontPage」というアクセスが「http://example.com/konawiki/index.php?p=FrontPage」に書き換えられるようにしています。

RewriteEngine On
RewriteRule ^([^\?\/\.]+)$ ./index.php?p=$1

一行目の「RewriteEngine On」で、mod_rewrite を有効にし、二行目のRewriteRule では、正規表現により、書き換えを行うルールを指定します。書式は「(正規表現) (置換後のパターン)」のように指定します。ちなみに、上記の正規表現は、「?」「/」「.」以外の連続する文字列があれば、それを $1 の部分に置き換えたURLにアクセスするという意味になります。

それから、Alias などを使って、DocumentRoot 以外のパスに Wiki を配置している場合には、RewriteBase にて、基本となるURLを指定すると確実に書き換えが行われるようになります。例えば、/tools/konawiki というディレクトリに KonaWiki を設置した場合には、次のように、RewriteBase にそのパスを指定します。

RewriteEngine On
RewriteBase /tools/konawiki/
RewriteRule ^([^\?\/\.]+)$ ./index.php?p=$1

mod_rewrite は、非常に高機能で強力なので、動的なページを静的に見せかける以外にも、いろいろな用途に利用できます。例えば、サイトのリニューアルで、ページ構造が変わってしまった場合に、以前の URL でも新しいコンテンツにアクセスしたい場合なども、こうした正規表現のパターンによってページを書き換えることができます。

しかし、mod_rewrite を使う方法では、Apache に mod_rewrite をインストールする必要があるため、レンタルサーバなどでは利用できない場合もあるでしょう。そんな時に使えそうなのが、ForceType を PHP に割り当てる、PATH_INFO を利用する方法です。

PATH_INFO を利用する方法

次に、PATH_INFO を利用して、動的ページを静的に見せる方法を紹介します。これは、Apache の FilesMatch と ForceType を利用するものです。このためには、.htaccess に次のような設定を記述します。

[PHP が モジュールとして動作している場合]
AcceptPathInfo On
<FilesMatch "^konawiki$">
    ForceType application/x-httpd-php
</FilesMatch>
DirectoryIndex konawiki index.php

[PHPが CGI として動作している場合]
<FilesMatch "^konawiki$">
   ForceType application/x-httpd-cgi
</FilesMatch>
DirectoryIndex konawiki index.php

これにより、konawiki とマッチするディレクトリ名があれば、それ以降にあるファイルやディレクトリのコンテンツタイプを、application/x-httpd-php (PHPアプリケーション)に書き換えます。そのため、「konawiki/」以降のディレクトリ情報を、必ず、PHPプログラムを通して利用できるようになります。

例えば、「http://example.com/konawiki/FrontPage/edit」というURLにアクセスすると、「konawiki」というPHPプログラムの中で、「FrontPage」と「edit」というパラメータを受け取ることができます。

それでは、Apacheのルートディレクトリに上記の「.htaccess」を作り、そこに「konawiki」という名前のファイルを作ってください(拡張子は無しにします)。そして、そのファイルの中に次のように記述します。

<?php
    $path = $_SERVER["PATH_INFO"];
    echo "PATH_INFO=".$path;
?>

準備ができたら、ForceTypeのテストしてみましょう。ブラウザを起動して「http://localhost/konawiki/aa/bb/cc/」にアクセスしてみましょう。うまくいけば、次のように、konawiki以下のディレクトリの値を得られます。

PATH_INFO

実際の KonaWiki では、この PATH_INFO の値を得て、1つめのディレクトリをページ名、2つめのディレクトリを編集などのモード、3つ目のディレクトリがあれば、その状態を表す補助パラメータとして利用しています。

今回のまとめ

今回は、動的なURLを持つ Wiki に、静的なURLを割り当てる方法について、mod_rewrite を使う方法、PATH_INFO を使う方法について紹介しました。今のところ、KonaWiki では、全てのURLの表現方法に対応していますが、全てのパターンでテストするのは大変なので、今後は、PATH_INFO だけに絞っていこうかなぁと考えているところです。この URL 書き換えのテクニックは、SEO 対策にもなりますので、気の利いたウェブサービスを開発する上でよく使う部分だと思います。

参考になるサイトの紹介

最後に、mod_rewrite や PATH_INFO を使う上で参考になるサイトをいくつか紹介します。

Series Navigation«どんな技術要素が必要になるのか編集の衝突を検出する»

執筆者紹介

クジラ飛行机

クジラ飛行机

くじらはんど(http://kujirahand/)にて、日本語プログラミング言語「なでしこ」(IPA未踏ユース採択)、テキスト音楽「サクラ」(OSPオンラインソフト大賞入賞)など多くのオンラインソフトを開発。著書に「Flexプロフェッショナルガイド」「なでしこ公式バイブル」、「一週間でマスターするActionScript3.0」など。

TrackBack URL :