Top/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件を表示しています。 コメントページを参照

  • 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 をいろいろといじり回していたときに,何かおかしな状態にしてしまったのかもしれません.失礼致しました.

  • ドス at 2009-12-02 (Wed) 11:59

    適用後http://example.com/pukiwiki/Wiki/PukiWiki/ このURLをhttp://example.com/pukiwiki/Wiki/PukiWiki 最後のスラッシュを取りたいのですがどおすれば出来るでしょうか

    • でぃあばぁ(管理者) at 2009-12-05 (Sat) 11:22

      ソースコード内のリンクを拡張子なしファイルのような形式にする修正を行い(修正箇所は上記パッチを参考にしてください)、上記「HTMLに偽装」のApacheの設定の最終行を「RewriteRule ^(.+)$ index.php?$1 [L]」に書き換えて設定すれば、お望みの形式になるかと思います。

  • ドス at 2009-12-09 (Wed) 14:36

    遅くなってすみません、ありがとうございます。

  • ドス at 2009-12-10 (Thu) 17:41

    たびたびすみません。ディレクトリに偽装はうまくいったのですが、このサイトのように例えば?testのページやindex.php?testのページにアクセスしたらリダイレクトで /test/のページに行くようにしたいのですがどうすればいいでしょうか? さくらインターネットサーバーを使っています。

    • でぃあばぁ(管理者) at 2009-12-13 (Sun) 22:20

      pukiwiki/lib/init.phpの「$arg = input_filter($arg); // \0 除去」の後、「// unset QUERY_STRINGs」の前に下記を挿入してみてください。

      // cmdやpluginなしで?が含まれていたら (例:index.php?Linux)
      if (
          (
              (strpos($_SERVER['REQUEST_URI'], 'cmd=')    === FALSE) &&
              (strpos($_SERVER['REQUEST_URI'], 'plugin=') === FALSE)
          ) && (strrpos($_SERVER['REQUEST_URI'], '?') !== FALSE)
      ) {
          header('HTTP/1.1 301 Moved Permanently');
          header('Location: /' . anchor_replace($arg) . '/');
          exit;
      }
      • ドス at 2009-12-15 (Tue) 19:02

        できました!ありがとうございます。

  • at 2010-01-04 (Mon) 15:22

    ロリポップ!レンタルサーバーで特に修正することなく動きました。ありがとうございます。

  • しょう at 2017-05-08 (Mon) 02:24

    /Front_Page/ の箇所を日本語化していて、その箇所を消してトップへリダイレクトさせたいのですが分かりません。具体的には右のURLでも訪ねているのでご確認ください→ https://centossrv.com/patio/centossrv.cgi?read=3077

  • しょう at 2017-05-08 (Mon) 02:24

    かけない?

  • しょう at 2017-05-08 (Mon) 02:25

    書けない?

  • しょう at 2017-05-08 (Mon) 02:35

    かけませんか。テストテストですです。

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を使って下さい。
差分 一覧