トップ > Appli > Pukiwiki > Pukiwiki を静的 URL で使うための mod_rewrite 設定

Pukiwiki を静的 URL で使うための mod_rewrite 設定

執筆中

標題の通り、Pukiwiki(このサイト)を静的 URL で扱うための設定に関してメモしておく。

はじめに

主旨

今回の試行の主旨は

http://main.tinyjoker.net/ページ名.html

という URL で Pukiwiki のページ

http://main.tinyjoker.net/index.php?ページ名

にアクセスさせることである。

きっかけ

きっかけはブックマークに入れるボタンサービス(画面右上にあるやつ) AddThis で、http://main.tinyjoker.net/index.php?ページ名 の形式の URL が http://main.tinyjoker.net/index.php?ページ名= のようなイコールつきに変換され、うまく登録できないことだった。

おそらく原因は Pukiwiki のクエリ(URL の ? 以降の)文字列である。クエリ文字列は A=B の形式が一般的だが、Pukiwiki のクエリは A だけである。先の AddThis の問題はこれに起因するのだが、詳細は調べていない。

実装

前項の問題を問題を解消するには、A だけで終わらないクエリにするか、静的な URL にする必要があった。今回は SEO の観点からも静的 URL のほうが望ましいと思われたため、これを採用した。

今回は従来形式(http://main.tinyjoker.net/index.php?ページ名)でのアクセスも新形式(http://main.tinyjoker.net/ページ名.html)で取得するように設定した。設定の条件をまとめると下記のようになる。

  1. 新形式でアクセスされた場合は従来形式に URL を書き換えてアクセスできること。
  2. 従来形式でアクセスされた場合は新形式にリダイレクトすること。
  3. その他の存在している URL はそのままアクセスすること。

1 の書き換えと 2 のリダイレクトの違いに関しては後述する。

まず、今回の設定に必要な手順は下記の通りである。

  1. 新形式でアクセスされた場合、従来形式に URL を書き換えるようにする。
  2. 新形式の Pukiwiki 内部リンクが出力されるように変更する。
  3. 従来形式でアクセスされた場合、新形式にリダイレクトするようにする。 1 と 3 は .htaccess による Apache 側の設定、2 は Pukiwiki 側の設定である。

注意

ここでの設定はあくまで筆者の環境においての場合であり、他の環境でも正常に動作する保証はないため、 設定にあたっては環境を確認の上、自己責任において行っていただきたい。

なお、Pukiwiki のバージョンは PukiWiki Plus! 1.4.7plus-u2-eucjp である。他の環境ではファイル名や行番号が異なる可能性があるため、注意すること。

カスタマイズ

1. mod_rewrite による新形式 URL でのページへのアクセス

"ページ名.html" を index.php?ページ名に飛ばし、あたかも "ページ名.html" が存在するかのようにふるまわせる。これを URL の書き換え(リライト)という。

リライトは Apache の mod_rewrite の機能を用いる。Apache 側でこれが有効になっている必要がある。サーバーによって異なるので、確認のこと。わからなければやってみればよい。これだけならさほど実害はない。

あたかも "ページ名.html" が存在するかのようにふるまわせる と書いたが、これはブラウザのアドレスバーには元々の URL ("ページ名.html")が表示されることを示す。実際には従来形式 URL からデータは取得されるのだが、ユーザーにも検索エンジンにも "ページ名.html" から取得されたように見えるわけだ。

.htaccess への RewriteRule の追加

実現するには、Pukiwiki のルートフォルダの .htaccess に次のようなリライト設定を書く(なければファイルを作る)。

# URL Rewrite
RewriteEngine On

# 存在するファイル・フォルダはリライトしない
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
# html ファイルを index2.php に書き換える
RewriteRule ^(.+)\.html$ index2.php?$1 [L]
  • RewriteEngine On でリライトを有効にするディレクティブ(命令)。
  • RewriteCond はリライトする条件(Condition)を指定するディレクティブである。
    • %{REQUEST_FILENAME} はリクエスト時のURLのファイル名を指す。
    • !-f, !-d はそれぞれ -f, -d の否定形で、-f, -d はファイル/ディレクトリが存在すれば true になるので、この場合は、ファイル/ディレクトリが存在しない場合のみ、リライトが実行される。
  • RewriteRule は実際にリライトするルールを記述する。
    • 第一引数がリライトされる元の URL、第二引数がリライト後の URL である。この場合、".html" がつく URL を "index2.php?$1" にリライトしている。このファイル名の記述に関しては正規表現の置換と同じなので、専門の文献を参照されたい。
    • 最後はオプションで、[L] はこのリライトを実行したあと、以後のリライトを実行しないことを示す。

ここで第二引数が index2.php になっているがこれは後で設定するリダイレクトとの無限ループを防ぐためである。これに関してはリダイレクトの項で述べる。このため、Pukiwiki のルートディレクトリに index.php をコピーした index2.php を作成しておく。

RewriteRule の動作確認

ここまでで新形式 URL でのアクセスが可能となっているはずである。従来の URL を新形式にして、実際にアクセスしてみる。従来通りページが表示されれば完了である。

2. Pukiwiki の内部リンクを変更する

lib/make_link.php の編集

920 行目あたり。make_pagelink 関数の中なので "function make_pagelink" で検索。

return $al_left . '<a ' . 'href="' . $script . '?' . $r_page . $anchor .
  '"' . $title . '>' . $s_alias . '</a>' . $al_right; 

$r_page = preg_replace("/%2F/", "/", $r_page);
return $al_left . '<a ' . 'href="' . $script . $r_page . '.html' . $anchor .
  '"' . $title . '>' . $s_alias . '</a>' . $al_right; 

注意すべきは 1 行目である。$r_page の %2F(スラッシュ "/" の URL エンコード)。 階層化ページをファイル名ではなく、ディレクトリ名として表現するため、もうちょっと上の rawurlencode で %2F にエンコードされたスラッシュを元に戻している。

2 行目は $script . $r_page . '.html' のところで新形式 URL を生成している。

lib/html.php の編集

71 行目あたり。トップページのリンク。"$_LINK['top']" で検索。

$_LINK['top']      = "$script?" . rawurlencode($defaultpage); 

$_LINK['top']      = $script; 

pukiwiki.ini.ja.php の編集

新形式ではページ名が階層構造("Software/LaUnch" など)になっている場合、ページが下位のディレクトリにあるかのように表示される。そのため、今まで相対パスで取得していた画像や JavaScript、CSS などがあれば、取得できなくなってしまうため、元(ルート)からのパスで取得するよう、定数を書き換える必要がある。

98 行目あたり。サイト画像のディレクトリ。

//define('IMAGE_DIR', 'image/');
define('IMAGE_DIR', '/image/'); 

104 行目あたり。ROOT_URI ルートを表す URI。

//define('ROOT_URI', '');
define('ROOT_URI', '/'); 

106 行目あたり。IMAGE_DIR, ROOT_URI 変更に伴い、元のままでは "//image/" になってしまうため。

//define('IMAGE_URI', ROOT_URI . IMAGE_DIR);
define('IMAGE_URI', IMAGE_DIR); 

plugin/recent.inc.php の編集

最近の更新ページを表示する recent プラグインは make_link の関数を使用していないので、個別に書き換える必要がある。

111 行目あたり。make_pagelink と同様に書き換える。

$items .= ' <li><a href="' . $script . '?' . $r_page . '"' . 
  ' title="' . $s_page . $passage . '">' . $title . '</a></li>' . "\n"; 

$r_page = preg_replace("/%2F/", "/", $r_page);
$items .= ' <li><a href="' . $script . $r_page . '.html"' . 
  ' title="' . $s_page . $passage . '">' . $title . '</a></li>' . "\n"; 

plugin/ls2.inc.php の編集

階層化されたページで下位のページをリスト表示するために用いられる ls2 も同様に変更が必要だ。

131 行目あたり。recent.inc.php と同様に書き換える。

$href   = $script . '?cmd=read&amp;page=' . $r_page; 

$r_page = preg_replace("/%2F/", "/", $r_page);
$href = $script . $r_page . '.html'; 

Pukiwiki サイト内リンクの確認

ここまででサイト内リンクがすべて新形式 URL になったか確認する。また、クリックして、目的のページが表示されるか確認する。特に日本語のページは注意が必要だ。

また、これらのファイル以外にもサイト内リンクを書き出すファイルがあるかもしれないので、もし利用している場合はそれらも同様に書き換える。

3. 旧形式 URL から新形式 URL へのリダイレクト

(2010/08/26 14:00:03)
関連ページ
  • Pukiwiki?
5687
プロフィール

Kenz Yamada(山田研二)。1984年生。大阪。ちょっとずつ好きなプログラム作ってます。 好きなものはカメラと旅行。ガジェットや身の回り、ちょっとこだわります。 詳しくは Web mixi で。

Bookmark and Share