默认情况下,DokuWiki 不会重写 URL,URL 就是这个样子:
http://example.com/doku.php?id=page
这些 URL 看起来杂乱无章而且不容易被搜索引擎索引。
所以应该启用 DokuWiki 默认关闭的URL 重写
。
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 应该换成您使用的实际文件夹名字。
DokuWiki 通过 userewrite 参数设置可以支持两种 URL 重写方法。一种依赖于网络服务器的重写能力,另一种是通过 DokuWiki 系统来处理 URL。下表详细列出。
值 | 信息 | 示例 URL |
---|---|---|
0 | 不启用 URL 重写。默认设置。 | http://example.com/dokuwiki/doku.php?id=wiki:syntax |
1 | 通过网络服务器重写。 | http://example.com/dokuwiki/wiki:syntax |
2 | 通过 DokuWiki 系统处理重写。 | http://example.com/dokuwiki/doku.php/wiki:syntax |
URL-Rewriting 默认关闭,因为该像设置除了要配置重写选项外,还需要其他关联设置 - 这些设置后续会涉及。
URL-Rewriting 可以通过 ?do=admin&page=config#_advanced
或者在本地文件夹的 conf/local.php 文件$conf['userewrite'] = N;
行设置开启。N 值可以是数字 0, 1,或者 2。默认值 0 不需要设置。根据选项值按照下面说明操作。
切记在配置管理器
/start?do=admin&page=config
中设置下面的值
否则重写规则不会起作用。
重写 URL 在 Apache 里是通过 mod_rewrite 模块(不管是Apache 1 还是 Apache 2)完成的。
DokuWiki 自带一个针对参数 1 的 .htaccess.dist
文件。
这就是示例
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
行注意,需要根据您的维基设置修改。如果您的维基在域名的顶层(例如:http://example.com 就会访问维基首页start)那么就需要将该行修改为:RewriteBase /
。
您还需要将.htaccess.dist
重命名为.htaccess
。
Dokuwiki 重写规则影响 apachectl status 命令行,会导致返回 DokuWiki 404 页面而不是服务器状态(server-status)信息,您可以将下面代码放入重写规则而修复该问题
RewriteCond %{REQUEST_URI} !^/server-status$
或者就是在 DokuWiki 根文件夹(就是doku.php所在的文件夹)创建一个空的服务器状态(server-status)文件。参见论坛文章 Apachectl status is broken with dokuwiki
您可能需要做这个。
启用 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}&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 App,将下面行放在 web.confg 文件内的 <system.webServer> 标签内(位于您的 App 的 wwwroot 目录)。
IIS 7.0 或者更高版本服务器可以基于适用于 x86 和x64 的 URL 重写模块 2.0 进行扩展。
保存上面 .htaccess 文件中适用于 Apache 重写规则(删除 “RewriteBase /dokuwiki” 行)。这不是必需的,因为我们要报规则直接加入到维基根目录。
在 IIS 管理器中选择维基目录,然后选择基于 IIS 的 “URL 重写”(如果您在安装维基前已经打开了管理器,需要刷新一下)
在右侧的操作界面,选择“导入规则”
针对您的配置未建,选择 .htaccess 并导入,您将会得到六条转换后的规则。
最后点击右侧的应用。
基于 .htaccess 规则配置您的维基重写 URL 完成,您可以查看一下效果了。
参见 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 ^/(.*) /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 服务器变量必须设置正确链接,可以在服务器部分采用下面设置:
fastcgi_param HTTPS on;
在文件夹之前的重写规则中 last
关键词就是为了确保重写只发生一次。上面提到的 /dokuwiki/ 文件夹要根据您的具体设置来修改。
如果您是复制——粘贴了这些配置,要确保安全页面说明添加了相关安全设置。
参见 httpd 文档。默认服务器根目录在 /var/www,DokuWiki 在 /var/www/dokuwiki
server "default" { listen on egress port 443 root "/dokuwiki" directory index doku.php # Set according to upload_max_filesize and post_max_size in php.ini connection max request body 20971520 location "*.php" { fastcgi socket "/run/php-fpm.sock" } # Block access to non-public dirs location "/data/*" { block } location "/conf/*" { block } location "/bin/*" { block } location "/inc/*" { block } location "/vendor/*" { block } # URL rewrite rules location match "/media/(.*)" { request rewrite "/lib/exe/fetch.php?media=%1" } location match "/detail/(.*)" { request rewrite "/lib/exe/detail.php?media=%1" } location match "/export/([^/]+)/(.*)" { request rewrite "/doku.php?do=export_%1&id=%2" } location match "/(lib/.*)" { request rewrite "/%1" } location match "/([^lib])" { request rewrite "/doku.php?id=$DOCUMENT_URI&$QUERY_STRING" } }
在您的 conf/local.php 文件中添加或者修改:
$conf['userewrite'] = 2;
该参数值不需要服务器任何设置。但是改设置依赖 Apache 扩展 CGI 标准的 PATH_INFO 功能。IIS 不能运行,但是最新版的好像可以。
尽管使用了美化的 URL,您可能还会遇到有 “DokuWiki” 参数的 URL:
PHP session ID:
http://example.com/example?DokuWiki=c81a95369a66576982119e2a60b557a5
这个参数是由 PHP 自动添加的会话 ID。他完全跟重写没关系。如果您不想他出现,可以通过设置 PHP 的 session.use_only_cookies
参数强制 PHP 使用 cookie 记录会话。
这需要在 php.ini 配置文件中设置:
session.use_only_cookies=1
You can also try:
session.use_trans_sid=0