DokuWiki

It's better when it's simple

ユーザ用ツール

サイト用ツール


ja:rewrite

URL の書き換え

FIXME このページは無秩序なので、書き直す必要があります。

DokuWiki のデフォルト設定では URL を書き換えず、URL はこんな感じになります:

http://example.com/doku.php?id=page

このような URL は綺麗ではなく、索引化の対象外とする検索エンジンもあります。

デフォルトでは無効にされている URL の書き換えを有効にすることで解決します。

日本語での概要説明

手順

  1. 管理者メニューを開けます。
  2. サイト設定管理画面を開けます。
  3. 「URLの書き換え」を .htaccess に変更します。(下の方にあるので検索して下さい)
  4. その下にある「URL上の名前空間の区切りにスラッシュを使用」を有効にして下さい。
  5. 「保存」して下さい。
  6. 次に、FTP やファイルマネージャを使用して、wikiを作成した /wiki/ フォルダにアクセスします。
  7. 中に .htaccess というファイルがあるはずです。(見えない場合、隠しファイルを表示するようにして下さい。レンタルサーバー独自のログイン時のオプションかもしれませんし、単純に .htaccess ファイルを作成してアップロードするだけかもしれません)
  8. .htaccess ファイルに以下を貼り付けます。
RewriteEngine on
 
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]
RewriteRule ^index.php$               doku.php

これで www.myexample.com/wiki-article のような形式になるはずです。 www.myexample.com/dokuwiki/wiki-article のような異なる形式の場合、以下の行をRewriteEngine on 直下に追加して下さい。

RewriteBase /dokuwiki

/dokuwiki は、実際に使用しているフォルダーの名前に変更する必要があります。

技術的に熟知するための詳細説明

設定項目: userewrite を有効にすることで、DokuWikiは二種類の URL 書き換えに対応しています。 一つは、Web サーバーの書き換え機能に依存しています。 もう一つは、DokuWiki 内部で書き換えられた URL を処理します。 次の表は、これらのオプションをまとめたものです。

設定値 概要 URL
0 URL を書き換えません。デフォルト設定です。 http://example.com/dokuwiki/doku.php?id=wiki:syntax
1 URL の書き換えは、Webサーバーが処理します。 http://example.com/dokuwiki/wiki:syntax
2 URL の書き換えを DokuWiki が行います。 http://example.com/dokuwiki/doku.php/wiki:syntax

URL の書き換えはデフォルトでは無効になっています。 適切な設定オプションを設定する以外に、追加の設定が必要なためです。 これらの設定については、以下で説明します。

URL の書き換えは ?do=admin&page=config#_advanced かローカルの conf/local.php ファイルの $conf['userewrite'] = N; 行で変更できます。 N は数字の 0〜2 です。 デフォルトは、この行が存在せず 0 扱いです。 いずれかのオプションを選択するには、以下の設定手順に従ってください。

オプション 1:Web サーバー

:!: 設定管理 /start?do=admin&page=config 内で以下の設定を忘れないで下さい。

  • URLの書き換え: .htaccess
  • URL上の名前空間の区切りにスラッシュを使用 [x]

そうしないと書き換えルールが有効になりません。

Apache

Apacheの場合、URL書き換えは Apache 1 または Apache 2mod_rewrite モジュールを使います。

DokuWiki には .htaccess.dist ファイルが付属しています。 このファイルにはオプション 1 に必要な書き換えルールが含まれています。

以下に例を示します:

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]
RewriteRule ^index.php$               doku.php

RewriteBase /dokuwiki 行で、wiki を取得するために URL 内で使用するディレクトリに /dokuwiki を置き換える必要があるかもしれません。 http://example.com のような wiki のスタートページがドメインの最上位に表示される場合、以下の行を使用します: RewriteBase /

ファイル名を .htaccess.dist から .htaccess に変更する必要もあります。

Apachectl status 破壊

DokuWiki 書き換えルールは apachectl status コマンドに影響し、サーバーステータスページの代わりにDokuWiki 404 ページを返すようになります。 どちらかの方法で修正可能です。 DokuWiki 書き換えルールにこれを置く

RewriteCond %{REQUEST_URI} !^/server-status$

または、doku.php が配置されている DokuWiki のルートフォルダ内に空の server-status ファイルを作成する。 Apachectl status is broken with dokuwiki というフォーラムの投稿を参照して下さい。

404 not found エラー

これを実行する必要があるかもしれません。

IIS (あるいは Microsoft Azure Web アプリ)

URLの書き換えを有効にして、適切なルールの組み合わせを挿入します:

<rewrite>
<rules>
 
<rule name="rule 1C" stopProcessing="true">
	<match url="^_media/(.*)" />
	<action type="Rewrite" url="/lib/exe/fetch.php?media={R:1}" appendQueryString="true" />
</rule>
<rule name="rule 2C" stopProcessing="true">
	<match url="^_detail/(.*)" />
	<action type="Rewrite" url="/lib/exe/detail.php?media={R:1}" appendQueryString="true" />
</rule>
<rule name="rule 3C" stopProcessing="true">
	<match url="^_export/([^/]+)/(.*)" />
	<action type="Rewrite" url="/doku.php?do=export_{R:1}&amp;id={R:2}" appendQueryString="true" />
</rule>
<rule name="rule 4C" stopProcessing="true">
	<match url="^$" />
	<action type="Rewrite" url="/doku.php" />
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
           </conditions>
</rule>
<rule name="rule 5C" stopProcessing="true">
	<match url="(.*)" />
	<action type="Rewrite" url="/doku.php?id={R:1}" appendQueryString="true" />
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
</rule>
<rule name="rule 6C">
	<match url="^index.php$" />
	<action type="Rewrite" url="/doku.php" />
</rule>
</rules>
</rewrite>

**Azure Web アプリを使用している場合、Web アプリの wwwroot 直下の web.config ファイルの中にある <system.webServer> タグ内にこれらの行を追加するだけです。

このルールはどこに挿入すべきなのでしょうか?!

IIS 7.0 以降

IIS 7.0 以降は、URL Rewrite module 2.0 で拡張することができます。 x86 用と x64 用を Microsoft が提供しています。

“RewriteBase /dokuwiki” 行を削除した上記の Apache のルールを .htaccess ファイルに保存します。 wiki のルートに直接ルールを追加するので、この行は不要です。

IIS Manager で Wiki フォルダを選択して、IIS の「URL Rewrite」を選択します。 (インストール作業前に、マネージャ開いていた場合、再読み込みが必要です。)

右側のアクション欄で「Import Rules…」を選択してください。

設定ファイルとして .htaccess ファイルを選択し「Import」します。これで6個の変換ルールが作成されるはずです。

最後に、右側のアクション欄の「Apply」をクリックします。

書き換えに .htaccess ルールを使用するように設定項目: userewrite を設定し、書き換えた URL を試してみて下さい。

Nginx

nginxマニュアルを参照して下さい。 以下の例では、サーバールートは /var/www 出力する dokuwiki は /var/www/wiki です。

server {
    listen 80;
    server_name example.com www.example.com;

    #maximum file upload size is 4MB - change accordingly if needed
    client_max_body_size 4M;
    client_body_buffer_size 128k;

    root /var/www/wiki;
    index doku.php;

    location / { try_files $uri $uri/ @dokuwiki; }

    location @dokuwiki {
        rewrite ^/_media/(.*) /lib/exe/fetch.php?media=$1 last;
        rewrite ^/_detail/(.*) /lib/exe/detail.php?media=$1 last;
        rewrite ^/_export/([^/]+)/(.*) /doku.php?do=export_$1&id=$2 last;
        rewrite ^/(?!lib/)(.*) /doku.php?id=$1&$args last;
    }

    location ~ \.php$ {
        if (!-f $request_filename) { return 404; }
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param REDIRECT_STATUS 200;
        fastcgi_pass 127.0.0.1:9000;
    }
}

https 使用する場合、HTTPS サーバー変数は DokuWiki 中の propper リンクを許可する設定にする必要があります。 これは、server セクションで行います:

fastcgi_param HTTPS on;

location 設定前の rewrite ルール内のキーワード last は書き換えが一度だけ行われる設定です。 上に登場した全ての /dokuwiki/ は、Web サーバのルートディレクトリからの相対 wiki ディレクトリに置き換えてください。

これらの設定をコピー&ペーストしている場合、セキュリティページの説明通りに、特定のディレクトリのセキュリティを確保するために location を追加していることを確認して下さい。

オプション 2:DokuWiki

conf/local.php ファイル内のこの行を追加・変更し、再読み込みします:

$conf['userewrite'] = 2;

このオプションの場合、Web サーバーの設定変更は不要です。 ただし、Apache に実装されているような CGI 標準の PATH_INFO 機能に依存しています。 IISは、この設定では動作しないことが知られています。 しかし、IIS の新しいバージョンはこれで動作するようです。

PHP セッション ID の消去

“clean” URL を使用しているにもかかわらず、以下のような “DokuWiki” パラメータが発生する場合があります:

PHP セッション ID:

http://example.com/example?DokuWiki=c81a95369a66576982119e2a60b557a5

このパラメータは PHP セッション ID で、自動的に PHP が追加します。 書き換えとは全く無関係です。 回避するには、session.use_only_cookies オプションを設定して、PHP に対してセッション用には常にクッキーを使用することを強制できます。

通常、php.ini 設定ファイルの編集で対応します:

session.use_only_cookies=1

以下も試して下さい:

session.use_trans_sid=0

関連項目

ja/rewrite.txt · 最終更新: by sawachan

特に明示されていない限り、本Wikiの内容は次のライセンスに従います: CC Attribution-Share Alike 4.0 International
CC Attribution-Share Alike 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki