執筆中
標題の通り、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 の書き換えと 2 のリダイレクトの違いに関しては後述する。
まず、今回の設定に必要な手順は下記の通りである。
ここでの設定はあくまで筆者の環境においての場合であり、他の環境でも正常に動作する保証はないため、 設定にあたっては環境を確認の上、自己責任において行っていただきたい。
なお、Pukiwiki のバージョンは PukiWiki Plus! 1.4.7plus-u2-eucjp である。他の環境ではファイル名や行番号が異なる可能性があるため、注意すること。
"ページ名.html" を index.php?ページ名に飛ばし、あたかも "ページ名.html" が存在するかのようにふるまわせる。これを URL の書き換え(リライト)という。
リライトは Apache の mod_rewrite の機能を用いる。Apache 側でこれが有効になっている必要がある。サーバーによって異なるので、確認のこと。わからなければやってみればよい。これだけならさほど実害はない。
あたかも "ページ名.html" が存在するかのようにふるまわせる と書いたが、これはブラウザのアドレスバーには元々の URL ("ページ名.html")が表示されることを示す。実際には従来形式 URL からデータは取得されるのだが、ユーザーにも検索エンジンにも "ページ名.html" から取得されたように見えるわけだ。
実現するには、Pukiwiki のルートフォルダの .htaccess に次のようなリライト設定を書く(なければファイルを作る)。
# URL Rewrite RewriteEngine On # 存在するファイル・フォルダはリライトしない RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f # html ファイルを index2.php に書き換える RewriteRule ^(.+)\.html$ index2.php?$1 [L]
ここで第二引数が index2.php になっているがこれは後で設定するリダイレクトとの無限ループを防ぐためである。これに関してはリダイレクトの項で述べる。このため、Pukiwiki のルートディレクトリに index.php をコピーした index2.php を作成しておく。
ここまでで新形式 URL でのアクセスが可能となっているはずである。従来の URL を新形式にして、実際にアクセスしてみる。従来通りページが表示されれば完了である。
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 を生成している。
71 行目あたり。トップページのリンク。"$_LINK['top']" で検索。
$_LINK['top'] = "$script?" . rawurlencode($defaultpage);
↓
$_LINK['top'] = $script;
新形式ではページ名が階層構造("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);
最近の更新ページを表示する 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";
階層化されたページで下位のページをリスト表示するために用いられる ls2 も同様に変更が必要だ。
131 行目あたり。recent.inc.php と同様に書き換える。
$href = $script . '?cmd=read&page=' . $r_page;
↓
$r_page = preg_replace("/%2F/", "/", $r_page);
$href = $script . $r_page . '.html';
ここまででサイト内リンクがすべて新形式 URL になったか確認する。また、クリックして、目的のページが表示されるか確認する。特に日本語のページは注意が必要だ。
また、これらのファイル以外にもサイト内リンクを書き出すファイルがあるかもしれないので、もし利用している場合はそれらも同様に書き換える。
Kenz Yamada(山田研二)。1984年生。大阪。ちょっとずつ好きなプログラム作ってます。
好きなものはカメラと旅行。ガジェットや身の回り、ちょっとこだわります。
詳しくは Web mixi で。