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
で始まるファイル、README
、 VERSION
、 COPYING
です。
# 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