デフォルトのDokuWikiはURLの書き換えを行わないため、生成されるURLはhttp://example.com/doku.php?id=pageのようになります。このようなURLは美しくない上に、一部の検索エンジンにインデックス化されにくいと考えられています。これに対処するにはURLの書き換えを使います。DokuWikiは、userewriteオプションで2種類の方法によるURL書き換えをサポートしています。1つめの方法はWebサーバの書き換え機能を利用し、2つめの方法はDokuWikiの内部でURL書き換えを処理します。次の表にオプションの設定値を再度説明します。
| 値 | 説明 | URL例 |
|---|---|---|
| 0 | URL書き換えを行わない(デフォルト) | http://example.com/dokuwiki/doku.php?id=wiki:syntax |
| 1 | WebサーバによるURL書き換えを行う | http://example.com/dokuwiki/wiki:syntax |
| 2 | DokuWikiによる書き換えを行う | http://example.com/dokuwiki/doku.php/wiki:syntax |
URL書き換えを行うには、userewriteオプションの設定以外にも追加の設定が必要になるため、デフォルトでは無効になっています。このマニュアルでは、URL書き換えのための追加の設定について説明します。
| $conf['userewrite'] = 1; |
このオプションはもっとも美しいURLを生成しますが、書き換えられたURLを解析して組み立てなおしたURLをDokuWikiに渡すためにWebサーバ側の設定が必要になります。
Apacheの場合、URL書き換えにはApache 1またはApache 2のmod_rewriteモジュールを使います。モジュールを有効にするには、httpd.confの以下の行を編集してください(コメントアウトを外す)。
LoadModule rewrite_module modules/mod_rewrite.so
モジュールの設定は、RewriteRuleディレクティブをサーバのconfigファイルに直接、またはDokuWikiのインストールディレクトリに置かれた.htaccessファイルに記述することで行います。DokuWikiに同梱されている.htaccess.distファイルには、オプション1に必要な書き換えルールが書かれていますがコメントアウトされています。書き換えを有効にするには、このファイルを.htaccessとしてコピーし(debianのユーザはdoku.phpと同じディレクトリにコピーするように注意)、以下の行のコメントアウトを外してください。
RewriteEngine on RewriteBase /dokuwiki 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] RewriteRule ^$ doku.php [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) doku.php?id=$1 [QSA,L]
RewriteBase /dokuwikiの行のうち/dokuwikiの部分は、対象のWikiにアクセスするためのURLに使っているディレクトリにあわせて編集してください。たとえば、ノーマル(オプション0)のURLがhttp://www.whatever.com/projects/documents/doku.phpの場合は、この行をRewriteBase /projects/documentsに書き換えます。また、この行がなくてもよい場合もあります。
.htaccessファイルはApacheのサーバconfigで許可されている場合にのみ有効になります。.htaccessを有効にするには、httpd.confに以下の行を追加してください。
<Directory /path/to/dokuwiki> AllowOverride All </Directory>
また、前項の書き換えルールをhttpd.confに直接記述してもかまいません。
<Directory /path/to/dokuwiki> RewriteEngine on ... ここに書き換えルールを記述 ... </Directory>
変更を有効にするには、Apacheを再起動する必要があります。
書き換えサポートを有効にした後、”403 - Forbidden”エラーが発生するようになったという報告があります。この場合は、次に示すようにFollowSymlinksディレクティブを設定することで解決するようです。
Options +FollowSymlinks RewriteEngine on ...etc.
前項の書き換えルールは、存在しないファイルやディレクトリもすべてDokuWikiのメインディスパッチャーにマッピングしますが、これは仮想マッピング(エリアス)に対しても適用されます。たとえば、/statsという仮想ディレクトリをWebアクセス統計にマッピングしているホスティングサービスを利用していて、この仮想ディレクトリに引き続きアクセスできるようにするには、次の例のように書き換え条件でこの仮想ディレクトリを除外する必要があります。
... RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !^/stats/(.*)$ ...
RewriteBaseなしで運用する場合(おそらく専用の仮想ホストの直下にDokuWikiをインストールする場合)、書き換えルールを次のように編集する必要があります。
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] RewriteRule ^/$ /doku.php [L] RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d RewriteRule (.*) /doku.php?id=$1 [QSA,L]
各RewriteRule節に先頭のスラッシュを付加してください。これを行わないとApacheは応答コード400を返します。
IISには標準の書き換えモジュールは用意されていません。私はISAPI Rewrite Lite(フリーウェア)を使って、以下に示す書き換えルールで動作させることができました(C:\Program Files\Helicon\ISAPI_Rewrite\httpd.ini参照)。
# Dokuwiki rules # Fix RSS Feeds RewriteRule ^(/wiki/)feed.php $1/feed.php [I,L] RewriteRule ^(/wiki/)feed.php\?(.*) $1/feed.php\?mode=$2&$3 [I,L] RewriteRule ^(/wiki/)_media/(.*)\?(.*) $1lib/exe/fetch.php\?media=$2&$3 [I,L] RewriteRule ^(/wiki/)_detail/(.*)\?(.*) $1lib/exe/detail.php\?media=$2&$3 [I,L] RewriteRule ^(/wiki/)_detail/(.*) $1lib/exe/detail.php\?media=$2 [I,L] RewriteRule ^(/wiki/)_export/([^/]+)/(.*) $1doku.php?do=export_$2&id=$3 [I,L] RewriteRule (/wiki/) $1doku.php [I,L] RewriteRule ^(/wiki/)\?idx=(.*) $1doku.php\?idx=$2 [I,L] RewriteRule ^(/wiki/)lib/(.*) $1lib/$2 [I,L] RewriteRule ^(/wiki/)(.*)\?do=(.*) $1doku.php\?id=$2&do=$3 [I,L] RewriteRule ^(/wiki/)doku.php\?id=(.*) $1doku.php\?id=$2 [I,L] RewriteRule ^(/wiki/)(.*) $1doku.php\?id=$2 [I,L] # this rule fixes a problem to see the old revisions RewriteRule ^(/wiki/)(.*)\?(.*) $1doku.php\?id=$2&$3 [I,L] # Diff still broken unless none is selected under 'use nice URL' options. You can still enter and link to nice URLs but the Dokuwiki program will use normal naming.
RewriteRule ^(/wiki/)の行のうち(/wiki/)の部分は、対象のWikiにアクセスするためのURLに使っているディレクトリにあわせて編集してください。たとえば、ノーマル(オプション0)のURLがhttp://www.whatever.com/projects/documents/doku.phpの場合は、この部分を^(/projects/documents/)に書き換えます。
無料でオープンソースのIonics Isapi Rewrite Filterを使用することも可能です。
IterationLimit 1 # QSA is not supported, fix it RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*)\?(.*) $1&$2 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] RewriteRule ^/$ /doku.php [QSA,L] # infinite redirect fix RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^/(.*)/$ /doku.php?id=$1 [QSA,L] # end fix RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^/(.*) /doku.php?id=$1 [QSA,L]
次に示す設定例は、ligty用にここで提案されているものを改良したバージョンです。
url.rewrite-once = (
"^(/|index.php)?$" => "/doku.php",
"^/lib/(.*)/?$" => "/lib/$1",
"^/_media/(.*)?\?(.*)$" => "/lib/exe/fetch.php?media=$1&$2",
"^/_media/(.*)$" => "/lib/exe/fetch.php?media=$1",
"^/_detail/(.*)?\?(.*)$" => "/lib/exe/detail.php?media=$1&$2",
"^/_detail/(.*)?$" => "/lib/exe/detail.php?media=$1",
"^/_export/([^/]+)/(.*)$" => "/doku.php?do=export_$1&id=$2",
"^/(?!doku.php|feed.php|robots.txt|sitemap.xml.gz)(.*)\?(.*)/?$" => "/doku.php?id=$1&$2",
"^/(?!doku.php|feed.php|robots.txt|sitemap.xml.gz|lib|_media|_detail|_export)(.*)/?$" => "/doku.php?id=$1",
)
次の設定例は、irc.freenode.netの#lighttpdチャンネルでdarix氏によって提供されたバージョンです。後続スラッシュなど多くのエラーを修正しています。
(訳注: many errors such as optional trailing slashが何を指すのかわかりません。原文: Here is a version from darix in irc.freenode.net #lighttpd which fixed many errors such as optional trailing slash etc…)
$HTTP["host"] == "wiki.example.org" {
server.document-root = "/srv/www/vhosts/example.org/wiki/htdocs"
# DO NOT FORGET THE TRAILING SLASH HERE
# var.wiki_base = "/wiki/"
# var.wiki_base = "/"
var.wiki_base = "/"
#
$HTTP["url"] =~ "^" + var.wiki_base {
#RewriteRule ^$ doku.php [L]
#RewriteRule ^index.php$ doku.php
index-file.names = ("doku.php")
}
url.rewrite = (
#
"^" + var.wiki_base + "lib/.*$" => "$0",
#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]
#RewriteRule (.*) doku.php?id=$1 [QSA,L]
#RewriteRule ^index.php$ doku.php
"^" + var.wiki_base + "_media/(.*)" => var.wiki_base + "lib/exe/fetch.php?media=$1", # [QSA,L]
"^" + var.wiki_base + "_detail/(.*)" => var.wiki_base + "lib/exe/detail.php?media=$1", # [QSA,L]
"^" + var.wiki_base + "_export/([^/]+)/(.*)" => var.wiki_base + "doku.php?do=export_$1&id=$2", # [QSA,L]
"^" + var.wiki_base + "doku.php.*" => "$0",
"^" + var.wiki_base + "(.*)\?(.*)" => var.wiki_base + "doku.php?id=$1&$2", # [QSA,L]
"^" + var.wiki_base + "(.*)" => var.wiki_base + "doku.php?id=$1", # [QSA,L]
)
}
darix氏のコードで画像やfeed.phpの表示でエラーが発生する場合は、次のバージョンを試してみてください。これは上述の2つの設定例を合成したバージョンです。
# rewrite for dokuwiki, example 3
$HTTP["host"] == "wiki.example.org" {
server.document-root = "/srv/www/vhosts/example.org/wiki/htdocs"
# DO NOT FORGET THE TRAILING SLASH HERE
var.wiki_base = "/dokuwiki/"
#
$HTTP["url"] =~ "^" + var.wiki_base {
index-file.names = ("doku.php")
}
url.rewrite = (
"^" + var.wiki_base + "lib/.*$" => "$0",
"^" + var.wiki_base + "_media/(.*)?\?(.*)$" => var.wiki_base + "lib/exe/fetch.php?media=$1&$2",
"^" + var.wiki_base + "_media/(.*)$" => var.wiki_base + "lib/exe/fetch.php?media=$1",
"^" + var.wiki_base + "_detail/(.*)?\?(.*)$" => var.wiki_base + "lib/exe/detail.php?media=$1&$2",
"^" + var.wiki_base + "_detail/(.*)?$" => var.wiki_base + "lib/exe/detail.php?media=$1",
"^" + var.wiki_base + "_export/([^/]+)/(.*)" => var.wiki_base + "doku.php?do=export_$1&id=$2",
"^" + var.wiki_base + "doku.php.*" => "$0",
"^" + var.wiki_base + "feed.php.*" => "$0",
"^" + var.wiki_base + "(.*)\?(.*)" => var.wiki_base + "doku.php?id=$1&$2",
"^" + var.wiki_base + "(.*)" => var.wiki_base + "doku.php?id=$1"
)
}
Nginxは非常に高速でかつ堅牢なhttpdです。詳細については、nginx projectおよびwiki(英語)を参照してください。次の設定例では、サーバルートが/var/wwwで、dokuwikiを/var/www/dokuwikiに展開するケースを想定しています。
server {
listen 80;
server_name _ *;
port_in_redirect off;
optimize_server_names off;
access_log /var/log/nginx/localhost.access.log;
rewrite ^(/dokuwiki/)_media/(.*) $1lib/exe/fetch.php?media=$2 last;
rewrite ^(/dokuwiki/)_detail/(.*) $1lib/exe/detail.php?media=$2 last;
rewrite ^(/dokuwiki/)_export/([^/]+)/(.*) $1doku.php?do=export_$2&id=$3 last;
location / {
root /var/www;
index index.html index.htm index.php;
}
location /dokuwiki/ {
if (!-f $request_filename) {
rewrite ^(/dokuwiki/)(.*)?(.*) $1doku.php?id=$2&$3 last;
rewrite ^(/dokuwiki/)$ $1doku.php last;
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:8888;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
Nginxはfastcgiを完全にサポートしています。環境に合わせた設定方法の詳細は、nginx fastcgiを参照してください。
location設定の前にある書き換えルール中の最後のキーワードlastは、書き換えが1度だけ行われるように指示しています。設定例の/dokuwiki/は、Webサーバのルートディレクトリから見たWikiの相対ディレクトリに置き換えてください。
| $conf['userewrite'] = 2; |
このオプションではWebサーバの設定は必要ありません。ただし、このオプションはCGI標準PATH_INFOのApacheでの実装に依存しています。IISではこの設定は動作しません1)。
ApacheのAliasディレクティブとこのオプションを併用すると、サーバに問題が発生しWikiが正しく動作しません。
書き換えによる「クリーンな」URLを有効にしても、URL中の次のような”DokuWiki”パラメータが付加されてしまうことがあります。
PHPセッションID:
http://example.com/example?DokuWiki=c81a95369a66576982119e2a60b557a5
このパラメータはPHPのセッションIDであり、書き換えとは関係なくPHPによって自動的に付加されます。セッションIDが付加されることを避けるには、PHPに対してセッション管理に常にクッキーを使うよう指示するために、PHPディレクティブsession.use_only_cookiesを設定します。
この設定は設定ファイルphp.iniに次のように記述します(Webホスティングサービスをご利用の場合は、プロバイダのサポートページでこれらの値を編集できるかどうかを確認してください)。
session.use_only_cookies=1
上記の設定を行ってもセッションIDが付加される場合は、次の設定を試してください。
session.use_trans_sid=0
PHPがApacheモジュールとして動作している環境では、次に示す構文によって.htaccessファイルでこれらの値を変更できます。
php_flag session.use_only_cookies on php_flag session.use_trans_sid off
私の場合は、誤ったsession.cookie_domainが設定されるという問題がありました(仮想ホスト設定下で誤ったドメイン名が設定される)。この問題は、httpd.conf内の適切なVirtualHostブロックにphp_value session.cookie_domain www.my.domain.comと記述することで解決できました(未検証ですが.htaccessでも同じように解決できるはず)。php.iniやApacheのconfigを編集できない環境では、ini_set('PHPディレクティブ', '値');関数が使えるはずです。コードを挿入する場所は、セッション開始前にインクルードされるconf/local.phpがよいでしょう。
私の場合は、FastCGI環境でセッションIDの問題が発生しました。FastCGIを無効にすることで解決できました。
どうしても問題を解決できない場合、inc/init.phpの次の行をコメントアウトしてみてください。
// session_name("DokuWiki");
// session_start();
basedirを指定することでオプション2が動作しました。 — BlackFog 2007-12-19 15:42basedirの値を設定する必要があるようです。doku.phpをルートディレクトリに配置する場合でも、basedirに/を指定する必要があります。 — Yihui Xie 2008/05/28 20:09このページはURL Rewritingの2008/05/28 14:36に更新されたリビジョンを元に翻訳しています。オリジナル文書の新しい更新に気づいた方は、差分を参照してアップデートしてください。
Original English revision: URL Rewriting – 2008/05/28 14:36
Please update this translation, if you notice the change in original English version.
翻訳を更新したら以下に日付つきの署名を追加してください。
Add your signature here if you created, translated or modified whole or part of this page.
マニュアル翻訳の品質向上のために査読(翻訳チェック)にご協力ください。誤字、脱字、訳抜け、わかりにくい訳語などの修正、技術的な観点からのブラッシュアップなど、お気づきの点がありましたらどんどん修正してください。査読を完了したら以下に日付つきの署名を追加してください。
To improve the quality of manual translation, please check this translation. Add your signiture here if you improved thist translation.
Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Noncommercial-Share Alike 3.0 Unported