DokuWiki

It's better when it's simple

Инструменты пользователя

Инструменты сайта


ru:rewrite

Это старая версия документа!


URL-преобразование

По умолчанию «ДокуВики» не производит преобразования URL1), что приводит к использованию URL подобных такому:

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

Такие URL выглядят довольно страшненько и, кроме того, плохо индексируются поисковыми машинами.

Выходом из этой ситуации является использование URL-преобразования. «ДокуВики» поддерживает два метода URL-преобразования, которые можно указать в настройке «userewrite». Один использует возможности преобразования обеспечиваемые веб-сервером, другой справляется с преобразованиями средствами самой «ДокуВики». Возможные значения опции «userewrite» приведены в следующей таблице.

Значение Описание Пример URL
0 Преобразование URL не используется. Это значение по умолчанию. http://example.com/dokuwiki/doku.php?id=wiki:syntax
1 Преобразование URL средствами веб-сервера. http://example.com/dokuwiki/wiki:syntax
2 Преобразование URL делается самой «ДокуВики». http://example.com/dokuwiki/doku.php/wiki:syntax

Преобразование URL отключено по умолчанию потому, что оно требует дополнительных настроек помимо установки значения самой опции. Рассмотрением этих настроек мы и займёмся далее.

К сведению. Чтобы опробовать примеры, излагаемые в статье, просто добавьте или измените строку в файле conf/local.php следующим образом: $conf['userewrite'] = N, где N равно 1 или 2 (ничего делать не нужно, если хотите N равное 0).

Метод 0: редактирование php-кода, замена имени стартового файла

Далее речь пойдет о замене стартовой страницы “doku.php, если вам вдруг нужно ее переименовать, скажем, по локальным причинам (это имя может нехорошо звучать на разных языках). Я использую Apache но думаю, что это не имеет значения..

  • Если вы хотите изменить имя папки (по умолчанию 'dokuwiki' - например на: 'mywiki'), никаких DokuWiki настроек не потребуется.
  • Если вы хотите изменить имя стандартного файла 'doku.php' (например на: 'start.php'):

1. Отредактируйте файл 'index.php' (что в папке /dokuwiki)

header("Location: start.php");

2. Отредактируйте файл '/inc/init.php' 'inc/preload.php' (в папке /dokuwiki), создайте, если его нет. inc/preload.php не является частью вики по умолчанию, поэтому не будет перезаписан во время установки обновлений.

<?php
if(!defined('DOKU_SCRIPT')) define('DOKU_SCRIPT','start.php');

Это все!

Если вы нашли еще php-файлы на редактирование, пожалуйста, укажите их здесь.

С ув. Bronek

Метод 1: с помощью веб-сервера

:!: Не забудьте установить следущие опции в Настройках вики /start?do=admin&page=config

  • Удобочитаемые адреса (URL): .htaccess
  • Использовать слэш в качестве разделителя именных зон в URL: [x]

Иначе правила URL-преобразований не будут работать.

Hiawatha

Apache

Преобразование URL в Apache делается с помощью модуля mod_rewrite для первой или второй версии Apache. Этот модуль активируется в httpd.conf указанием следующей строки (убедитесь, что она не закоментирована):

LoadModule rewrite_module modules/mod_rewrite.so

Во многих клонах Linux (Ubuntu, Debian и т. д.) вы можете активировать mod_rewrite так:

sudo a2enmod rewrite

Настройка модуля mod_rewrite делается с помощью так называемых правил преобразования (rewrite rules), которые могут быть определены как в основном файле настройки сервера или в файле .htaccess в основной директории «ДокуВики». «ДокуВики» поставляется с файлом .htaccess.dist, содержащим необходимые (правда, закомментированые) правила преобразования для метода 1. Для активации URL-преобразования просто скопируйте этот файл в .htaccess и раскомментируйте строки.

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 на нужную вам. Предположим, что ваш нормальный (при userewrite=0) URL выглядит так http://www.whatever.com/projects/documents/doku.php. Тогда вам нужно написать в этой строке RewriteBase /projects/documents. Однако, иногда эта строка не нужна вовсе.

Некоторые замечания

Файл .htaccess принимается во внимание только, если это разрешено в основном файле конфигурации Apache. Многие инсталляции Apache по умолчанию этого не делают. Для разрешения попробуйте добавить в httpd.conf следующее:

<Directory /path/to/dokuwiki>
   AllowOverride AuthConfig FileInfo Limit
</Directory>

P. S. В примере выше в AllowOverride указанны только опции необходимые для работы в дефолтной конфигурации. Если для вас это не работает, попробуйте разрешить все AllowOverride All

В качестве альтернативы вы можете указать вышеприведенные правила преобразования непосредственно в httpd.conf:

<Directory /path/to/dokuwiki>
  RewriteEngine on
  ... здесь правила преобразования...
</Directory>

Может понадобиться перегрузка Apache для того, чтобы изменения вступили в силу.

Некоторые пользователи сообщают о появлении ошибке «403 — Forbidden» после включения поддержки преобразования. Установка опции FollowSymlinks должна решить эту проблему:

Options +FollowSymlinks
RewriteEngine on
 
...etc.

Приведённые выше правила преобразования отсылают все запросы на несуществующие файлы и директории к основному «ДокуВики». Это может быть применено и к виртуальным отображениям (aliases). Некоторые сайты отображают доступ к статистике в виртуальной директории /stats. Для того, чтобы эта виртуальная директория оставалась доступной, вам нужно исключить ее из условий преобразования. Например:

...
RewriteCond %{REQUEST_FILENAME}       !-f
RewriteCond %{REQUEST_FILENAME}       !-d
RewriteCond %{REQUEST_URI} !^/stats/(.*)$
...

Если ваш сайт работает без RewriteBase, например из-за того, что вы хоститесь в выделенном VirtualHost, вы должны соответственно изменить правила преобразования.

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 doesn't come standard with a rewrite module. I used ISAPI Rewrite Lite (free) successful with these rewrite rules (see the file 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.

For all lines with RewriteRule ^(/wiki/), you need to replace the (/wiki/) with whatever directory you use in your URL to get to the wiki. Say that your normal (Option 0) URL is http://www.whatever.com/projects/documents/doku.php . You will need to set the above line to ^(/projects/documents/).

Ionics Isapi Rewrite Filter

It is also possible to use Ionics Isapi Rewrite Filter, which is free and open-source.

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

Assuming you have followed instructions for how to set up dokuwiki under lighttpd. If you haven't, define var.dokudir as shown in the example.

# rewrites for dokuwiki
$HTTP["url"] =~ "^" + var.dokudir { index-file.names = ("doku.php") }
    url.rewrite = (
      "^" + var.dokudir + "/lib/.*$"              => "$0",
      "^" + var.dokudir + "/_media/(.*)?\?(.*)$"  => var.dokudir + "/lib/exe/fetch.php?media=$1&$2",
      "^" + var.dokudir + "/_media/(.*)$"         => var.dokudir + "/lib/exe/fetch.php?media=$1",
      "^" + var.dokudir + "/_detail/(.*)?\?(.*)$" => var.dokudir + "/lib/exe/detail.php?media=$1&$2",
      "^" + var.dokudir + "/_detail/(.*)?$"       => var.dokudir + "/lib/exe/detail.php?media=$1",
      "^" + var.dokudir + "/_export/([^/]+)/(.*)\?(.*)$" => var.dokudir + "/doku.php?do=export_$1&id=$2&$3",
      "^" + var.dokudir + "/_export/([^/]+)/(.*)" => var.dokudir + "/doku.php?do=export_$1&id=$2",
      "^" + var.dokudir + "/doku.php.*"           => "$0",
      "^" + var.dokudir + "/feed.php.*"           => "$0",
      "^" + var.dokudir + "/(.*)\?(.*)"           => var.dokudir + "/doku.php?id=$1&$2",
      "^" + var.dokudir + "/(.*)"                 => var.dokudir + "/doku.php?id=$1"
    )

An example config can be seen here.

Nginx

Nginx is a very fast and stable httpd, see more about nginx project, and an English wiki. In the following example, our server root is /var/www, and we extract dokuwiki to /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;
        }
    }

Notes

Nginx has complete support for fastcgi, please reference nginx fastcgi document to fit your setup.

The last keyword of rewrite rules before location setup make sure that rewrite only happens once. You should replace all /dokuwiki/ appeared above to you wiki directory relative to web server root directory.

Метод 2: ДокуВики

$conf['userewrite'] = 2;

This option won't need any webserver setup. However it relies on the PATH_INFO feature of the CGI standard as implemented by Apache. IIS is known not to work with this setting2). IIS6 (MS Server 2003) works pretty fine, when basedir is set to /.

Using Apache's Alias directive with this option can lead to severe headaches and broken wiki! ⇐ A patch which should solve this problem is available here: https://www.trg-oha.de/~sstrickroth/dokuwiki-alias.patch

Чистые ID сессий PHP

Несмотря на использование «чистых» URL, вы можете столкнуться с «параметром ДокуВики» в URL, выглядящим как:

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

Этот параметр является ID сессии PHP и добавляется самим PHP автоматически. Это абсолютно не связано с преобразованием URL. Для того, чтобы избежать этого, вы можете принудить PHP всегда использовать cookies для работы с сессиями, выставив опцию session.use_only_cookies в настройках PHP.

Это обычно делается в файле php.ini (если вы используете сервер хостера, то выясните в его поддержке, как можно редактировать этот файл):

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

Если вы не можете использовать ни то, ни другое решение (многие вебхостеры запрещают редактирование php.ini и использование php_flag в .htaccess), вам придется редактировать conf/local.php. Заметим, что упомянутые выше настройки не могут быть изменены вызовом ini_set(), начиная с версии PHP 4.2.3, поэтому единственный способ сделать это — использовать следующее:

ini_set('url_rewriter.tags', '');
My problem was that my session.cookie_domain was incorrectly set (I'm doing virtual hosting, and the domain name was incorrect). I added
php_value session.cookie_domain www.my.domain.com

to the appropriate virtualhost in my httpd.conf (though .htaccess would probably work just as well), and the polluted URLs disappeared. Also, if you can't get to your php.ini or apache config, you should be able to use ini_set('PHP variable', 'value'); to the same effect (it seems that conf/local.php is a good place to put this, as the file is included before the session is started).

In my case, FastCGI was causing session IDs to appear. Disabling it removed them.

Обсуждение

  • Even when using above configuration with Apache, often the URL becomes example.com/doku.php, no matter at what page you are. I could not find a solution to that.
    • It's an implementation issue, not a rewriting problem. — BlackFog 2007-12-19 15:42
  • Option = 2 works with IIS 6 (Windows 2003) and current nightly build if basedir is set. — BlackFog 2007-12-19 15:42
  • For Option = 2, it seems that we need to specify the value of basedir no matter which system we are using (Apache or IIS, etc); even when doku.php is just in the root dir we still need to specify basedir as /Yihui Xie 2008/05/28 20:09
  • For a long time I used DokuWiki (2) rewrite option, and now there are some links like …/wiki/doku.php/… spread through the internet. If now I'll use .htaccess rewrite method (1), which is discussed here, all those old links with doku.php will become invalid. Is it possible to add some rules so that old links were still valid? If yes, please, explain how can it be done.
    • The solution was to add RewriteRule doku.php/(.*) doku.php?id=$1 [QSA,L] right after RewriteRule ^_export/([^/]+)/(.*) doku.php?do=export_$1&id=$2 [QSA,L] line.
  • Using rewrite rules for nginx that are presented breaks retrieval of images from dokuwiki. It seems to be not using the default value of root:
[error] 27613#0: *1 open() "/usr/local/nginx/html/wiki/lib/tpl/arctic/images/button-firefox.png" failed
  • My solutions is to add the following to the nginx.conf:
location /wiki/lib/ {
  root /var/www/path/to/site.../;
}

thedimi.net 2009-03-06 00:00

  • With IIS and Helicon Isapi_Rewrite, if Dokuwiki is in the root, the code for httpd.ini should be (note the absence of the subdirectory and the fact that there are 2 lines for «_media» and not just 1 as mentioned in the code above):
# Dokuwiki rules
# Fix RSS Feeds
RewriteRule ^(/)feed.php $1/feed.php [I,L]
RewriteRule ^(/)feed.php\?(.*) $1/feed.php\?mode=$2&$3 [I,L]
 
RewriteRule ^(/)_media/(.*)\?(.*) $1lib/exe/fetch.php\?media=$2&$3 [I,L]
RewriteRule ^(/)_media/(.*) $1lib/exe/fetch.php\?media=$2 [I,L]
RewriteRule ^(/)_detail/(.*)\?(.*) $1lib/exe/detail.php\?media=$2&$3 [I,L]
RewriteRule ^(/)_detail/(.*) $1lib/exe/detail.php\?media=$2 [I,L]
RewriteRule ^(/)_export/([^/]+)/(.*) $1doku.php?do=export_$2&id=$3 [I,L]
 
RewriteRule (/) $1doku.php [I,L]
 
RewriteRule ^(/)\?idx=(.*) $1doku.php\?idx=$2 [I,L]
RewriteRule ^(/)lib/(.*) $1lib/$2 [I,L]
RewriteRule ^(/)(.*)\?do=(.*) $1doku.php\?id=$2&do=$3 [I,L]
RewriteRule ^(/)doku.php\?id=(.*) $1doku.php\?id=$2 [I,L]
RewriteRule ^(/)(.*) $1doku.php\?id=$2 [I,L]
 
# this rule fixes a problem to see the old revisions
RewriteRule ^(/)(.*)\?(.*) $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.

Trouble. apache2, php2 (external module), current dokuwiki, configuration in virtual host:

 <LocationMatch "/(data|conf|bin|inc)/">
  Order allow,deny
  Deny from all
  Satisfy All
 </LocationMatch>
 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 %{DOCUMENT_ROOT}%{REQUEST_FILENAME}		!-f
 RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}		!-d
 RewriteRule (.*)										/doku.php?id=$1  [QSA,L]

and request to «site.ru/_media/nasharahsamario.jpg» gives 403 (forbidden) dokuwiki page error log says: client denied by server configuration: /lib/exe rewrite log:

85.21.2.184 - - [25/Feb/2011:11:19:52 +0300] [wp.website.ru/sid#b7857b08][rid#b79de0a0/initial] (2) rewrite '/_media/nasharahsamario.jpg' -> '/lib/exe/fetch.php?media=nasharahsamario.jpg'
85.21.2.184 - - [25/Feb/2011:11:19:52 +0300] [wp.website.ru/sid#b7857b08][rid#b79de0a0/initial] (2) local path result: /lib/exe/fetch.php
85.21.2.184 - - [25/Feb/2011:11:19:52 +0300] [wp.website.ru/sid#b7857b08][rid#b79de0a0/initial] (1) go-ahead with /lib/exe/fetch.php [OK]
85.21.2.184 - - [25/Feb/2011:11:19:52 +0300] [wp.website.ru/sid#b7857b08][rid#b79dfe68/initial/redir#1] (2) init rewrite engine with requested uri /error/HTTP_FORBIDDEN.html.var
85.21.2.184 - - [25/Feb/2011:11:19:52 +0300] [wp.website.ru/sid#b7857b08][rid#b79dfe68/initial/redir#1] (2) rewrite '/error/HTTP_FORBIDDEN.html.var' -> '/doku.php?id=/error/HTTP_FORBIDDEN.html.var'

thx


1) C:\..\DokuWikiStick\server\conf\httpd.conf

httpd.conf
# absolute minimum configuration for DokuWiki on a Stick
# change the Listen directive if you want to use a different port
...
...
 
# Configure the path to php.ini
PHPIniDir php
 
# http://localhost:8800/doku.php?id=ru:start > http://localhost:8800/ru/start
<Directory ./../dokuwiki>
    AllowOverride AuthConfig FileInfo Limit
</Directory>
 
 
AcceptPathInfo off
KeepAlive on
KeepAliveTimeout 15
TimeOut 30
DirectoryIndex index.html index.php

2) C:\..\DokuWikiStick\dokuwiki\.htaccess>

.htaccess
## http://localhost:8800/doku.php?id=ru:start > http://localhost:8800/ru/start
 
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

3) C:\..\DokuWikiStick\dokuwiki\conf\local.php

local.php
..
$conf['userewrite'] = 1; // .htaccess
$conf['useslash']   = 1;
$conf['fnencode']   = 'utf-8';
..
1)
URL rewriting
ru/rewrite.1509905083.txt.gz · Последнее изменение: 2017-11-05 19:04 — 95.73.203.207

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: 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