statichtml.inc.php

Top > Plugin > statichtml.inc.php
First Edition. 12/22/2007
Last Modified. 12/22/2007
Tag: PukiWiki Plugin

PukiWikiの静的HTMLシステム化

SummaryPukiWikiの静的HTMLシステム化
Developersonots
First Edition12/22/2007
LicenseGPL
Table of Contents

Abstract

動的な PHP アプリケーションである PukiWiki の HTML 出力を静的 HTML ファイルに保存しておき、ユーザには静的HTMLファイルを参照してもらうことで軽量化を図ります。

注1:動的システムではなくなるので、動的システムによる恩恵はすべて得られなくなります。例えばカウンタープラグインなどは別途外部 cgi を利用するなど工夫をする必要がありますし、ls 系プラグインの動的出力も使用できなくなります。
注2:mod_rewrite の使えるサーバ環境が必須になります。

使用法

プラグイン設定項目一覧

必要ならば変更できる設定項目です。 statichtml.inc.php を開いて以下の部分を編集します。

$this->CONF['SPECIAL_PAGES'] = array($whatsnew, $whatsdeleted);
$this->CONF['readauth']      = TRUE;
$this->CONF['username']      = '';
$this->CONF['userpass']      = '';
$this->CONF['ADMINONLY']     = TRUE;
  • SPECIAL_PAGES
    • 書き込み時自動ダンプで、対象ページがダンプされると同時に、常にダンプしなおすページです。
  • readauth=bool
    • 閲覧制限されているページもダンプ。
      補足: ダンプされた html ファイルを同様に閲覧制限したい場合はは各自 .htaccess を編集して pukiwiki とは別に閲覧制限する必要があります(解説はしません)。
  • username
    • 閲覧制限ページ用ユーザ名。閲覧制限されているページを取得する際にユーザ名、パスワードが必要になります。
      補足: この機能を使用する場合 PEAR の HTTP/Request.php が必要になります(インストール方法の解説はしません)。
  • userpass
    • Username に対するパスワード。
  • ADMINONLY=bool
    • デフォルトではアクション型で一括ダンプの際に管理者権限を必要とします。FALSE にすることで無効にもできます。

一括ダンプ(アクション型)

アクション型プラグインとしてアクセスしてください。

http://あなたのPukiWikiサイト/index.php?cmd=statichtml

cmd=statichtml

項目は以下の意味です。

  • Admin Password
    • 管理者パスワード
  • Filter Pages (ereg)
    • 対象ページを絞りこむときに使用。指定しなければ全ページ。
  • A Page
    • 特定の1ページだけ指定するときに使用。
  • Force to Overwrite
    • 強制上書き。未チェックの場合、html ファイルと wiki ページのタイムスタンプを比べ wiki ページが新しければ上書きダンプします。

インストール

これらの対応がすべてすでに行われているパッケージが PukiWiki Static! にて利用可能です。ご利用ください。

PukiWiki Static! 化

ここでは PukiWiki Plus! を 静的システム化(PukiWiki Static! 化と呼ぶことにします)する手順を解説します。

1. PukiWiki Plus! をダウンロード。インストールし、起動確認はすんでいるものとします。ここでは仮に

http://www.example.com/pukiwiki-static/

というアドレスで運用していたものとし、サーバ上でのローカルパスは

$HOME/public_html/pukiwiki-static

であるものとし、$HOME/public_html/ が DOCUMENT_ROOT であるものとします。

2. RewriteMap のページからパッチをダウンロードし、ページに記述してあるように PukiWiki Plus! 本体にパッチを適用します。アクセスしてみて特にエラーがでないことを確認します。

3. pukiwiki-static/ ディレクトリ内に pukiwiki ディレクトリを作成し、index.php, .htaccess, .htpasswd 以外のファイルを移動します。

$ mkdir temp
$ mv pukiwiki-static temp/pukiwiki
$ mv temp pukiwiki-static
$ mv pukiwiki-static/pukiwiki/{index.php,.htaccess,.htpasswd} pukiwiki-static/

index.php ファイルを編集し、移動先ディレクトリ名を指定します。

-define('SITE_HOME',     '');
-define('DATA_HOME',     '');
-define('ROOT_URI',      '');
-define('WWW_HOME',      '');
+define('SITE_HOME',     'pukiwiki/');
+define('DATA_HOME',     'pukiwiki/');
+define('ROOT_URI',      '/pukiwiki-static/pukiwiki/');
+define('WWW_HOME',      'pukiwiki/');

ROOT_URI には絶対 URI で指定しなければならないことに注意してください(http 始まりでも可)。

アクセスしてみて特にエラーがでないことを確認します。

4. RewriteMap のページから rewritemap.inc.php プラグインをダウンロードし extend/plugin ディレクトリに保存します。

svn:plugin/rewritemap.inc.php.diff から statichtml.inc.php との連携用パッチをダウンロードし、パッチを当てます。

$ cd extend/plugin
$ patch < rewritemap.inc.php.diff

そうしてできたものが実は svn:plugin/rewritemap.inc.php にあるので、ダウンロードして上書きします。

5. .htaccess にて mod_rewrite の設定を行います。以下の内容を追加します。

## RewriteMap
RewriteEngine On
RewriteBase /pukiwiki-static
RewriteCond %{REQUEST_URI} =/pukiwiki-static/
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_FILENAME}/index.html -f
RewriteRule .* index.html [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.html$ index.php?cmd=rewritemap&page=$1 [QSA,L]

RewriteBase に設置ディレクトリ名をドキュメントルートからの絶対パスで指定していることと、 次の行の RewriteCond に設置ディレクトリ名をドキュメントルートから絶対 URI で指定していことに注目してください(http 始まりでも可)。 最後の / も気をつけてください。

アクセスしてみて、PukiWiki Plus! 上のリンクアドレスが index.php?ページ名 の形式から /ページ名.html に変わっていることを確認します。

6. svn:plugin/statichtml.inc.php から statichtml プラグインをダウンロードし、plugin もしくは extend/plugin ディレクトリに保存します。

pukiwiki-static ディレクトリに書き込み許可を出します。pukiwiki-static ディレクトリに HTML ファイルが出力されます(index.php と同階層のディレクトリです)。

$ chmod 777 .

7. PukiWiki にアクセスし、リンクが正常に動作していることを確認します。

あなたのぷきうぃきサイト/index.php?cmd=statichtml

にアクセスし、ダンプが正しく動作することを確認します。確認できたら全ページを一括変換しておきます。

ページの編集、保存時に HTML ファイルが更新されるようにするためには、次の章の変更も行う必要があります。

ページ保存時にダンプ

ページ編集、保存時に自動的にHTMLファイルを新規するように pukiwiki/lib/file.php の編集をします。 page_write 関数の末尾に

	log_write('update',$page);
+	if (exist_plugin('statichtml')) {
+		do_plugin_init('statichtml');
+		call_user_func_array('plugin_statichtml_write_after', array($page, &$postdata, $notimestamp, &$oldpostdata));
+	}

のように追加します。

rename 時にダンプ

ページをリネームした際に、HTML ファイルのリネーム(正確には削除→ダンプ)をするようにします。

plugin_rename_proceed 関数に、以下を追加します。

              links_update($old);
              links_update($new);
          }
      }
+     if (exist_plugin('statichtml')) {
+         $statichtml = new PluginStatichtml();
+         foreach ($pages as $oldpage => $newpage) {
+             $oldfile = $statichtml->get_dump_filename(decode($oldpage));
+             if (is_writable($oldfile)) unlink($oldfile);
+             $statichtml->dump_page(decode($newpage), null, true);
+         }
+     }
      $postdata = get_source(PLUGIN_RENAME_LOGPAGE);
      $postdata[] = '*' . $now . "\n";

この改変プラグインは PukiWiki Static! パッケージに同梱してあります。

従来 php アドレスを html アドレスにリダイレクト

過去に従来通りの PukiWiki として運営していた場合、php アドレスへのリンクが張られていることと思います。 php アドレスにアクセスされては静的化した意味がないので、検索エンジンが HTML ファイルへリンクし直すように、301 Moved Permanently を知らせて、HTML ファイルへリダイレクトさせることができる仕組みを用意しています。

lib/pukiwiki.php を以下のように改変します。

$retvars = array();
$page  = isset($vars['page'])  ? $vars['page']  : '';
$refer = isset($vars['refer']) ? $vars['refer'] : '';

if (isset($vars['cmd'])) {
        $plugin = & $vars['cmd'];
} else if (isset($vars['plugin'])) {
        $plugin = & $vars['plugin'];
} else {
        $plugin = '';
}

+if (exist_plugin('statichtml')) {
+    do_plugin_init('statichtml');
+    plugin_statichtml_onread($page);
+}

従来通りの php アクセスもやりたい場合は、svn:plugin/edit.php を index.php と同階層に置き、edit.php にアクセスしてください。 edit.php のほうではリダイレクトなどを行いません。

PukiWiki 本家 の Static! 化

PukiWiki 本家には ROOT_URI (SKIN_URI, IMAGE_URI) のような URI パスと、ローカルディレクトリパス (SKIN_DIR, IMAGE_DIR) を区別する仕組みがないので適用は難しそうです。苦肉の策として以下の方法がひょっとしたら動くかもしれません(試していません)。

ステップ 3. index.php の編集を以下のように読み換えます。

index.php ファイルを編集し、移動先ディレクトリ名を指定します。

-define('DATA_HOME',     '');
-define('LIB_DIR',       'lib/');
+define('DATA_HOME',     'pukiwiki/');
+define('LIB_DIR',       'pukiwiki/lib/');

pukiwiki.ini.php ファイルを編集し、移動先ディレクトリ名を絶対URIで指定します(http 始まりでも可)。

-define('SKIN_DIR', 'skin/');
-define('IMAGE_DIR', 'image/');
+define('SKIN_DIR', '/pukiwiki-static/pukiwiki/skin/');
+define('IMAGE_DIR', '/pukiwiki-static/pukiwiki/image/');

SKIN_DIR を PukiWiki Plus! での SKIN_URI(URIパス)の意味で使用することにします。 PukiWiki Plus! での SKIN_DIR の役割(ローカルディレクトリパス)を持つものがないので、ハードコーディングしていくことにします。

ステップ 3.5. として以下の編集を行います。

default.ini.php ファイルを編集します。

-define('SKIN_FILE', DATA_HOME . SKIN_DIR . 'pukiwiki.skin.php');
+define('SKIN_FILE', DATA_HOME . 'skin/' . 'pukiwiki.skin.php');

keitai.ini.php ファイルを編集します。

-define('SKIN_FILE', DATA_HOME . SKIN_DIR . 'keitai.skin.php');
+define('SKIN_FILE', DATA_HOME . 'skin/' . 'keitai.skin.php');

他にも SKIN_DIR を URI パスではなくローカルディレクトリパスの意味で使用しているプラグインなど何かがあったら、そこを 'skin/' に変更します。 この2箇所ぐらいで済むと思うのですがとにかく試していません。

FAQ

HTML ファイルが作成されない

xrea.com などのいくつかの SAFE_MODE が有効になっているレンタルサーバーではファイル(ディレクトリ)が正常に作成できない場合があります。mkdir.cgi を使用することで回避できます。

1. svn:plugin/mkdir.cgi を index.php と同階層にダウンロード。

2. mkdir.cgi を編集、パスワードを設定。mkdir.cgi に実行権限を付与 (755)

$GLOBALS['password'] = md5('');

3. 起動確認。

あなたのぷきうぃきサイト/mkdir.cgi

にアクセスし、CGI として動作するか確認する。php へのパスは

#!/usr/local/bin/php

が指定してあるが、異なる場合変更する(正しいパスは各レンタルサーバーのドキュメントで調べてください)

4. svn:plugin/statichtml.ini.php を pukiwiki/init ディレクトリにダウンロード。

5. statichtml.ini.php 中の以下の部分のコメントをはずし有効化

$baseuri = substr(get_script_uri(), 0, strrpos(get_script_uri(), '/')) . '/';
$GLOBALS['PLUGIN_STATICHTML_MKDIR_CGI'] = $baseuri . '/mkdir.cgi?password=' . md5('');

この時、さきほど設定したパスワードを md5('') の部分に同様に設定。 この設定を行うと statichtml.inc.php が mkdir するのに mkdir.cgi を使用するようになります。

index.php 省略で運営したい(していた)

pukiwiki.ini.php にて

$scirpt_directory_index = 'index.php';

と設定し、index.php を省略できるように運営していた場合、その省略されたアドレスにブックマークやリンクをすでに張られている場合があると思います。 その場合は .htaccess に

DirectoryIndex index.php index.html

と追加しさえすれば従来どおりのアドレスで、従来どおり稼動してくれます(通常デフォルトでは index.html が index.php よりも優先されていると思いますが、それを index.php が優先されるようにしています)。 DirectoryIndex の指定が許可されていることが前提です。

技術的詳細

経緯

RewriteMap プラグイン、パッチを使用することを前提に dump2html.inc.php を軽量、単純化しました。

dump2html.inc.php が全ページの HTML ダンプ(バックアップ)を主な目的にしているのに対し、statichtml.inc.php は PukiWiki の軽量化を主な目的とします。

Related

ページ名→HTMLファイル名変換ルール

できるだけ英語ページ名をそのままHTMLファイル名として利用したかったので以下のルールを採用しています。

エンコード

$encode = rawurlencode($page);
# 英語ページ名をそのまま使用するため PukiWiki 的な bin2hex ではなく rawurlencode
$encode = str_replace('%2F', '/', $encode);
# ディレクトリセパレータを元に戻す
$encode = str_replace('-', '%2D', $encode); # rawurlencode(chr(hexdec('2D'))) == '-'
# '-' も rawurlencode ライクエンコード。されるとしたら %2D になるはず。bin2hex('-') == '2d'
$encode = preg_replace('/%([0-9a-f][0-9a-f])/i', '\\1-', $encode);
# %F7 => F7- に変換。% ではなく - にする。
# HTML ファイル名が %F7.html の場合、アクセスURLは %20F7.html (rawurlencode('%') == '%20')
# F7-.html ならば F7-.html とアクセス可能
# %F7 -> -F7 でないのでは、- はファイル名の先頭に使用できないため。_ でも問題はない。

デコード

$decode = preg_replace('/([0-9a-f][0-9a-f])-/i', '%\\1', $encode);
$decode = str_replace('%2D', '-', $decode);
$decode = rawurldecode($decode);
# 先のエンコードルールは一意的にデコード可能

リダイレクトフロー

html アドレスにアクセス

  • html ファイルが存在 → html アドレス、実体 html
  • html ファイルが存在しない → html アドレス、実体 php

php アドレスにアクセス (html へのリダイレクト設定済みの場合)

  • html ファイルが存在 → html アドレスにリダイレクト (php) → html アドレス、実体 html
  • html ファイルが存在しない → php アドレス、実体 php

Download

Save from right-click, and put into plugin directory.

リビジョンマニュアル変更履歴
headManual/Plugin/statichtml.inc.php/devhtml ファイルも「タイムスタンプを更新しない編集」
rev453Manual/Plugin/statichtml.inc.php/rev453index.php アクセスから html ファイルへの 301 Moved Permanently 対応
rev438Manual/Plugin/statichtml.inc.php/rev438