====== URLの書き換え ======
デフォルトのDokuWikiはURLの書き換えを行わないため、生成されるURLは%%http://example.com/doku.php?id=page%%のようになります。このようなURLは美しくない上に、一部の検索エンジンにインデックス化されにくいと考えられています。これに対処するにはURLの書き換えを使います。DokuWikiは、[[ja:config#URLの書き換え : userewrite|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書き換えを行うには、[[ja:config#URLの書き換え : userewrite|userewrite]]オプションの設定以外にも追加の設定が必要になるため、デフォルトでは無効になっています。このマニュアルでは、URL書き換えのための追加の設定について説明します。
===== オプション 1: Webサーバ =====
| $conf['userewrite'] = 1; |
このオプションはもっとも美しいURLを生成しますが、書き換えられたURLを解析して組み立てなおしたURLをDokuWikiに渡すためにWebサーバ側の設定が必要になります。
==== Apache ====
Apacheの場合、URL書き換えには[[http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html|Apache 1]]または[[http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html|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に以下の行を追加してください。
AllowOverride All
また、前項の書き換えルールをhttpd.confに直接記述してもかまいません。
RewriteEngine on
... ここに書き換えルールを記述 ...
変更を有効にするには、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 ==
IISには標準の書き換えモジュールは用意されていません。私は[[http://www.isapirewrite.com/|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 ===
無料でオープンソースの[[http://www.codeplex.com/IIRF|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]
==== Lighttpd ====
次に示す設定例は、ligty用に[[http://apassant.net/blog/2006/02/11/dokuwiki-url-rewriting-in-lighttpd/|ここで提案]]されているものを改良したバージョンです。
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氏によって提供されたバージョンです。後続スラッシュなど多くのエラーを修正しています。
FIXME(訳注: 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 ====
Nginxは非常に高速でかつ堅牢なhttpdです。詳細については、[[http://nginx.net/|nginx project]]および[[http://wiki.codemongers.com/Nginx|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を完全にサポートしています。環境に合わせた設定方法の詳細は、[[http://wiki.codemongers.com/NginxHttpFcgiModule|nginx fastcgi]]を参照してください。
location設定の前にある書き換えルール中の最後のキーワードlastは、書き換えが1度だけ行われるように指示しています。設定例の/dokuwiki/は、Webサーバのルートディレクトリから見たWikiの相対ディレクトリに置き換えてください。
===== オプション 2: DokuWiki =====
| $conf['userewrite'] = 2; |
このオプションではWebサーバの設定は必要ありません。ただし、このオプションはCGI標準PATH_INFOのApacheでの実装に依存しています。IISではこの設定は[[bug>718|動作しません]](([[#討論]]を参照))。
Apacheの**Aliasディレクティブ**とこのオプションを併用すると、サーバに問題が発生しWikiが正しく動作しません。
===== PHPセッションIDを取り除く =====
書き換えによる「クリーンな」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を編集できない環境では、**[[phpfn>ini_set('PHPディレクティブ', '値')]];**関数が使えるはずです。コードを挿入する場所は、セッション開始前にインクルードされるconf/local.phpがよいでしょう。
> 私の場合は、FastCGI環境でセッションIDの問題が発生しました。FastCGIを無効にすることで解決できました。
==== DREAMHOST: ====
どうしても問題を解決できない場合、inc/init.phpの次の行をコメントアウトしてみてください。
// session_name("DokuWiki");
// session_start();
====== 討論 ======
* Apacheの設定を行いましたが、どのページでもURLがexample.com/doku.phpになってしまいます。どうやったら解決できるでしょう。
* これは書き換えの問題ではなく、環境の問題です。 --- //BlackFog 2007-12-19 15:42//
* 現在のnightlyビルドとIIS 6(Windows 2003)において、''basedir''を指定することでオプション2が動作しました。 --- //BlackFog 2007-12-19 15:42//
* オプション2については、利用しているシステム(Apache、IISなど)に関係なく、''basedir''の値を設定する必要があるようです。''doku.php''をルートディレクトリに配置する場合でも、''basedir''に''/''を指定する必要があります。 --- //[[xie@yihui.name|Yihui Xie]] 2008/05/28 20:09//
====== 翻訳について ======
=====オリジナル文書のリビジョン=====
このページは[[rewrite|URL Rewriting]]の2008/05/28 14:36に更新されたリビジョンを元に翻訳しています。オリジナル文書の新しい更新に気づいた方は、[[http://www.dokuwiki.org/wiki:rewrite?do=revisions|差分]]を参照してアップデートしてください。
Original English revision: [[rewrite|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.
*[[denden@denden-cafe.com|denden]] -- 2008/06/11 translation completed
=====査読者=====
マニュアル翻訳の品質向上のために査読(翻訳チェック)にご協力ください。誤字、脱字、訳抜け、わかりにくい訳語などの修正、技術的な観点からのブラッシュアップなど、お気づきの点がありましたらどんどん修正してください。査読を完了したら以下に日付つきの署名を追加してください。
To improve the quality of manual translation, please check this translation. Add your signiture here if you improved thist translation.
*