2017-02-05

tobijibu

DokuWikiのURLをniceにする

DokuWikiでは、初期設定ではURLにdoku.phpがついてきます。悪くはないですが少しカッコ悪いです。そこで、Apacheのmod_rwriteモジュールを使ってURLの書き換えるようにルールを設定してみましょう。

今回の説明で利用するファイルはこちらにあります。

.htaccessを入手する

DokuWikiにはダウンロード直後のディレクトリに.htaccess.distというファイルが用意されています。

このファイルはDokuWikiをインストールすると消えてしまいますので、再度DokuWikiをダウンロードする等して取得してください。

なお、こちらにも編集前のデータをアップしてあります。

.htaccess.distを編集

取得した.htacces.distを編集します。編集とは言っても、必要な箇所をアンコメントするだけです。

Optionsを設定します。httpd.confで設定していない場合はアンコメントしてください。httpd.conf側で設定されていれば設定不要です。

-Indexes

ディレクトリリスティングを禁止します。index.html等が存在しない場合に、ファイル一覧を表示させない設定です。

-MultiViews

拡張子が指定されていないファイルへアクセスした際に、対象ファイルの候補を探索して、自動的に拡張子を付与してアクセスする仕組みです。基本的にDokuWikiでは不要なので無効化します。

+FollowSymLinks

シンボリックリンクを許可します。この設定をオンにすると、DokuWikiのルート以下にシンボリックリンクがある場合、そのファイルをそのまま表示することが出来てしまいます。 セキュリティ的に気になる設定ですが、シンボリックリンクを設置しない限りほぼ問題は無いでしょう。

# You should disable Indexes and MultiViews either here or in the
# global config. Symlinks maybe needed for URL rewriting.
# -Indexes    : ディレクトリリスティングを禁止します。index.html等が存在しない場合に、ファイル一覧を表示させない設定です。
# -MultiViews : 拡張子が指定されていないファイルへのアクセスがあった場合に、
#               対象ファイルの候補を探索して、自動的に拡張子を付与してアクセスする仕組みです。
#               基本的にDokuWikiでは不要なので無効化します。
Options -Indexes -MultiViews +FollowSymLinks

続いてアクセス不可対象ファイルの設定です。この部分は理由が無ければ変更不要です。

この設定はDokuWikiのルートディレクトリにある特定のファイルへのアクセスを禁止します。 特定のファイルとは、.htで始まるファイル、READMEVERSIONCOPYINGです。

# make sure nobody gets the htaccess, README, COPYING or VERSION files
# DokuWikiのルートディレクトリにある特定のファイルへのアクセスを禁止します。
# 特定のファイルは、.htで始まるファイル、README、VERSION、COPYINGです。
<Files ~ "^([\._]ht|README$|VERSION$|COPYING$)">
    <IfModule mod_authz_host>
        Require all denied
    </IfModule>
    <IfModule !mod_authz_host>
        Order allow,deny
        Deny from all
    </IfModule>
</Files>

次に.gitのアクセス設定です。この部分も特に理由が無ければ変更不要です。

一般的な方法でインストールした場合はgitを利用しませんので、本来ならば設定する理由はありません。

設定した方が良いパターンとは、例えば、githubからソースをダウンロードしてインストールした場合は必要です。また、インストール後にファイルの変更をgitを利用して管理している場合は設定が必要です。

もしsvnやMercurial等、他のソース管理ツールを利用している場合は、.svn.hg等を設定しておいた方が良いでしょう。

# Don't allow access to git directories
# .gitディレクトリへのアクセスを禁止します。
<IfModule alias_module>
    RedirectMatch 404 /\.git
</IfModule>

続いてRewriteEngineをアンコメントしてmod_rewriteを有効にします。

$conf['userewrite']1に変更する必要があります。設定はDokuWikiの管理メニューから「サイト設定」にある"URLの書き換え"設定を.htaccessに変更してください。

# Uncomment these rules if you want to have nice URLs using
# $conf['userewrite'] = 1 - not needed for rewrite mode 2
# mod_rewriteを有効にします。
RewriteEngine on

次にRewiteRuleをアンコメントして、特定ページへのアクセス時の書き換えルールを設定します。具体的には_media_detail_exportへのアクセスです。

例えば_mediaにアクセスした場合はlib/exe/fetch.php?media=$1に書き換えます。その時_media/ikaであればlib/exe/fetch.php?media=ikaに書き換わりますが、_media/ika?page=editというように、他のGETパラメータが付与されていた場合はlib/exe/fetch.php?media=ika&page=editになります。

これは、QSAフラグが指定されている為です。QSAフラグを指定しないと、書き換え時に?page=editが削除されてしまうので、それを回避します。

# _media、_detail、_exportにアクセスした場合はそれぞれ該当するURLにパラメータを付与してアクセスします。
RewriteRule ^_media/(.*)              lib/exe/fetch.php?media=$1  [QSA,L]
RewriteRule ^_detail/(.*)             lib/exe/detail.php?media=$1  [QSA,L]
RewriteRule ^_export/([^/]+)/(.*)     doku.php?do=export_$1&id=$2  [QSA,L]

上記と同様にRewiteRuleをアンコメントします。こちらはアクセスURLをdoku.phpに書き換えるルールを指定します。

RewriteCondではアクセス対象のファイルや、ディレクトリが存在しない場合には対象のファイル名を付与したページを表示します。

RewriteCondで指定した条件は、その直後に記載されたRewiteRuleのみに適用されます。今回の場合は、RewriteRule (.*)です。

# http://domain/でアクセスした場合にhttp://domain/doku.phpを表示します。
RewriteRule ^$                        doku.php  [L]
# 指定されたファイルとディレクトリが存在しない場合は該当パラメータのページを表示します。
# つまり「この文書は存在しません」ページが表示されます。
RewriteCond %{REQUEST_FILENAME}       !-f
RewriteCond %{REQUEST_FILENAME}       !-d
RewriteRule (.*)                      doku.php?id=$1  [QSA,L]
# http://domain/index.phpでアクセスした場合にhttp://domain/doku.phpを表示します。
RewriteRule ^index.php$               doku.php

最後に書き換え対象となるURLの基点を指定します。要はDokuWikiのドキュメントルートです。環境に併せて設定してください。不要であればコメントのままで問題ありません。

# Not all installations will require the following line.  If you do,
# change "/dokuwiki" to the path to your dokuwiki directory relative
# to your document root.
RewriteBase /

最下部の設定はアンコメントしていません。DokuWiki上でAPI等を生成し、外部からコンテンツを取得する場合など、XML-RPCを利用するのであればアンコメントしてください。内容を見る限りhttpsのみに対応しているようです。

## If you enable DokuWikis XML-RPC interface, you should consider to
## restrict access to it over HTTPS only! Uncomment the following two
## rules if your server setup allows HTTPS.
#RewriteCond %{HTTPS} !=on
#RewriteRule ^lib/exe/xmlrpc.php$      https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]

サーバへアップロード

ここまで設定できたら、.htaccess.distをDokuWikiのルートディレクトリへアップロードします。アップロードする時、またはしてからでも構いませんが、.htaccess.dist.htaccessに変更します。

DokuWikiへアクセスし、URLが短縮された(doku.phpが表示されていない)状態であれば正しく設定できています。

おつかれさまでした。

参考サイト

mod_rewriteモジュールについて詳しく解説しています。
OXY NOTES - http://oxynotes.com/?p=7392