Top/PukiWiki/改造/静的コンテンツに偽装/ページ

PukiWikiはてなブックマーク

問題

PukiWiki のページは example.com/index.php?PukiWiki のような形で参照されるが、
一般的に動的ページは検索エンジンにクロールされにくいらしい

解決するには

mod_rewriteを用いて静的コンテンツに偽装する。
ここでは以下の2つの方法を説明します。

注意

  • 以下ではPukiWikiを設置したディレクトリをドキュメントルートから見て /pukiwiki/ としています。
    PukiWikiを /foo/bar/ に設置している場合は、/pukiwiki/ を /foo/bar/ に読み替えて下さい。
  • ページ名を / で階層化している場合
    httpd.conf に AllowEncodedSlashes On を追加して下さい。
    これは Apache 2.0.46 から追加されたディレクティブで、
    従来デコードされなかった %2F を / にデコードするためのものです。
    Offになっていて %2F が含まれている場合、mod_rewriteは一切動作しなくなります。
    • ただし、このディレクティブはApache1.3系には存在しないので、
      ソースを編集する必要があります。脆弱性は上がるので要注意。

HTMLに偽装*1 Permalinkはてなブックマーク

動作

例えば Wiki/PukiWiki というページへのリンクは次のように変わります。

適用前http://example.com/pukiwiki/index.php?Wiki%2FPukiWiki
適用後http://example.com/pukiwiki/Wiki%2FPukiWiki.html

Apacheの設定

下記を次のどちらかに記述

  • PukiWikiを設置したディレクトリの.htaccess内
  • httpd.confのPukiWikiを設置したディレクトリを指定した<Directory>コンテナ内
    Options FollowSymLinks
    
    RewriteEngine on
    RewriteOptions MaxRedirects=1
    RewriteBase /pukiwiki/
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.+)\.html$ index.php?$1 [L]

PHPスクリプトの修正個所

file「HTMLに偽装」パッチ(PukiWiki1.4.4専用)

パッチの当て方

PukiWikiをインストールしたディレクトリにパッチを置き、次のようにしてパッチを当てて下さい。*2

patch -p1 < camo_html02.diff

ディレクトリに偽装 Permalinkはてなブックマーク

動作

例えば Wiki/PukiWiki というページへのリンクは次のように変わります。

適用前http://example.com/pukiwiki/index.php?Wiki%2FPukiWiki
適用後http://example.com/pukiwiki/Wiki/PukiWiki/

副作用として、Sleipnirなどの 上のディレクトリに移動 ボタンでPukiWikiの親階層に上がれるようになります。

Apacheの設定

下記を次のどちらかに記述

  • PukiWikiを設置したディレクトリの.htaccess内
  • httpd.confのPukiWikiを設置したディレクトリを指定した<Directory>コンテナ内
    Options FollowSymLinks
    
    RewriteEngine on
    RewriteOptions MaxRedirects=1
    RewriteBase /pukiwiki/
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)/$ index.php?$1 [L]

PHPスクリプトの修正個所

履歴

パッチの当て方

PukiWikiをインストールしたディレクトリにパッチを置き、次のようにしてパッチを当てて下さい。*3

patch -p1 < camo_dir_147.diff

PukiWiki1.4.4用パッチでの注意点

PukiWikiを /foo/bar/ に設置している場合は、上記パッチ内の /pukiwiki/ を /foo/bar/ に置換後、パッチを当てて下さい。

関連

コメント等ありましたらどうぞ :)

最新の10件を表示しています。 コメントページを参照

  • はいろ at 2005-11-11 (金) 14:22

    これまでindex.phpとadmin.phpでそれぞれREADONLYを個別に設定するような使い方をいていたのですが、今回「ディレクトリに偽装」の改造を導入したいと思いパッチを適用したところ、この方法が通用しないことに気づきました。こちらのサイトでは編集用の認証と、それに伴うツールバーの表示切替はどのようにされているのでしょうか?

  • はいろ at 2005-11-11 (金) 14:24

    認証をpukiwiki.ini.phpの$edit_authで設定し、公式の続・質問箱/282(下段)>http://pukiwiki.sourceforge.jp/?%E7%B6%9A%E3%83%BB%E8%B3%AA%E5%95%8F%E7%AE%B1%2F282の方法を使ってツールバーの表示を切り替えるよう試してみたのですが、この方法だとリンク先にも書かれているとおりindex.phpにアクセスしただけで認証ダイアログが表示されてしまいます。

  • はいろ at 2005-11-11 (金) 14:25

    ぎゃ、リンクをミスりました。ごめんなさい。

    • でぃあばぁ(管理者) at 2005-11-11 (金) 21:13

      cubic9.comでは全てを場当たり的に修正しています :p まず編集認証を次のような感じにしてます。*4

      <?php $auth_users = array(
          'hoge'  => '{SMD5}OzJo/boHwM4q5R+g7LCOx2xGMkFKRVEx', // SMD5 'hoge_passwd'
      );
      $auth_method_type = 'pagename'; // By Page name
      $edit_auth = 1;
      $edit_auth_pages = array(
          '#^((?!^(SandBox)|(コメント/.+)$).)*$#' => 'hoge',
      ); ?>

      スキンは自前でテキトーに書いたもので、ツールバーは$_SERVER['PHP_AUTH_USER']で表示を切り替えています。

      <?php if (isset($_SERVER['PHP_AUTH_USER']) && ($_SERVER['PHP_AUTH_USER'] == 'hoge')) { ?>
      ...ツールバー...
      <?php } ?>

      このままでは認証するまでツールバーが表示されないので、認証はブックマークに入れてある http://example.com/?cmd=edit&page=FrontPage をクリックして行ってます。
      全体的にセキュリティは怪しげです。

    • でぃあばぁ(管理者) at 2005-11-11 (金) 22:26

      以前のような使い方をなさりたいのであれば、次のように別のPukiWiki(例ではwiki_b)を設置し、wikiやattachなどのデータディレクトリを共有するようにすればいいのではないでしょうか。

      ディレクトリ用途作業
      wiki_a閲覧用データディレクトリの変更, PKWK_READONLYを1にする, 偽装パッチを当てる
      wiki_b編集用データディレクトリの変更
      dataデータ用wiki_aのattach,backup,cache,counter,diff,trackback,wikiを移動

      共有の方法については公式サイトに例があったと思います。恐らくpukiwiki.ini.phpのDirectory settings Iの部分を変更するだけでOKです。

  • はいろ at 2005-11-11 (金) 23:31

    うぉーq(T▽Tq)このような勝手な質問にお答えいただきありがとうございます。大変参考になりました。どちらの方法をとるか迷いますが、これで無事パッチが導入できそうです。

  • はいろ at 2005-11-13 (日) 16:47

    たびたび恐れ入ります。上のほうのコメントにあるslash.phpなのですが、これは書かれている中身の他に何かrequireでファイルを読み込む必要でもあるのでしょうか?(^^;

    • でぃあばぁ(管理者) at 2005-11-13 (日) 20:05

      func.phpからinput_filterとanchor_replaceをコピーしてくれば動きます。ただし何のチェックもしていないので、一つ間違うと無限ループです :p 一応 RewriteOptions MaxRedirects=1 で避けていますが、正直全くお勧めできません。

  • はいろ at 2005-11-14 (月) 00:22

    おかげさまで、なんとか動くようになりました(´▽`)ただ、slash.phpを有効にすると、どういうわけか普通にページを開いただけで認証ダイアログが出てしまいますorz(教えていただいた$edit_authを使う方法でこれまでうまくいっていたのですが)

    • はいろ at 2005-11-14 (月) 00:51

      どうやらpukiwikiをサブディレクトリに設置しているのが問題らしく、slash.phpのLocation: /をLocation: /pukiwiki/にした時点でこの現象がおきるようです。

  • Logue at 2005-12-26 (月) 16:10

    html偽装したまではよかったが、全部index.phpにリダイレクトされてしまう。もしもfoo.htmlが存在したときにそっちにアクセスするようにしたい場合はどうしたらいんでしょう?

    • でぃあばぁ(管理者) at 2005-12-26 (月) 20:12
      RewriteCond %{REQUEST_FILENAME} !-f

      を指定するとどうですか?

  • Logue at 2006-01-02 (月) 23:17

    具体的に言うとGoogle Sitemapの認証対策です。PukiWikiでsitemapを作るプラグインはあるんですけど、認証を受けるときにいちいち、htaccessでそのときだけhtml偽装を解除するのもどうかなと思って。

  • machu at 2006-02-12 (日) 21:38

    Apache1.3+PHP4.3.10+PukiWiki1.4.6で「静的コンテンツに偽装」をやってみたところ、日本語ページ名のときにページが表示されませんでした。Apache側がURLをデコードしているのが原因のようです。「RewriteRule ^(.+)\.html$ index.php?cmd=read&page=$1 [L]」と書くことで、回避できました。

    • でぃあばぁ(管理者) at 2006-02-13 (月) 22:12

      ご報告ありがとうございます。おっしゃる通り一部のページ名で不具合が出るようです。なお、このサイトでは扱っていませんが、PATH_INFOを使う場合はデコード処理が入らないため、この不具合は起こらないようです。

  • かがみ at 2008-06-25 (Wed) 07:33

    ディレクトリ偽装パッチ (camo_dir_147.diff.2) を使わせて頂こうと試行錯誤中です.基本的にはうまく動いているのですが,編集時にプレビューをしようとすると「ページの内容は空です」と表示されてしまうという症状が出るようになりました.プレビューせずに更新すれば正常に書き換わります.当初は RewriteEngine を疑いましたが,RewriteEngine をオフにしても同様です.このような症状が出ているのは私のところだけでしょうか?

    • かがみ at 2008-06-25 (Wed) 23:20

      原因がわかりました.お騒がせしてすみません.何かの拍子に DATA_DIR に .txt という空っぽのファイルができてしまっており,これが plugin/edit.inc.php の中の plugin_edit_preview() でテンプレートとして読み込まれしまっていました.DATA_DIR/.txt がいつの間に作られたのかは謎ですが,導入当初 RewriteEngine をいろいろといじり回していたときに,何かおかしな状態にしてしまったのかもしれません.失礼致しました.

name:

参考

次回更新用メモ

  • anchor_replaceでついでに%XXを%xxにしてしまうと、プロポーショナルフォントで表示されたときに短く見えていいかもしれない。

Amazon

Amazon

*1 PukiWiki1.4系はXHTML1.1だから .xhtm に偽装する方が正しいのかもしれないけど
*2 WindowsでPukiWikiを運用している方はGNU patch v2.1 for Win32を使って下さい。
*3 WindowsでPukiWikiを運用している方はGNU patch v2.1 for Win32を使って下さい。
*4 実際の設定とは異なります。
差分 一覧