Это старая версия документа!
Содержание
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).
Метод 1: с помощью веб-сервера
$conf['userewrite'] = 1; |
Опишем эти настройки для разных веб-серверов.
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, поэтому единственный способ сделать это — использовать следующее:
<code php>
ini_set('url_rewriter.tags',
);
</code>
My problem was that my session.cookie_domain was incorrectly set (I'm doing virtual hosting, and the domain name was incorrect). I addedphp_value session.cookie_domain www.my.domain.comto 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 whendoku.php
is just in the root dir we still need to specifybasedir
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 withdoku.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 afterRewriteRule ^_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:
<LocationMatch "/(data|conf|bin|inc)/"> Order allow,deny Deny from all Satisfy All </LocationMatch> Options +FollowSymlinks RewriteEngine on RewriteLog /var/log/apache2/rewrite_log 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]
on virtualhost - dokuwiki.su/_media/nasharahsamario.jpg gives 403 (forbidden)