DokuWiki

It's better when it's simple

用户工具

站点工具


zh:rewrite

URL 重写

默认情况下,DokuWiki 不会重写 URL,URL 就是这个样子:

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

这些 URL 看起来杂乱无章而且不容易被搜索引擎索引。

所以应该启用 DokuWiki 默认关闭的URL 重写

简介

启用步骤

  1. 进入管理
  2. 打开配置设置
  3. 选择 漂亮的 URLs 参数为 .htaccess (使用查找功能,向下翻,很远哦)
  4. 在其关联选项里,找到“使用斜线作为 URL 分隔符”并选中
  5. 保存
  6. 接下来,使用 FTP 或者文件管理器,您需要访问您创建维基的/wiki/文件夹。
  7. 该文件夹里,您会看到叫做 .htaccess 和 .htaccess.dist 的文件。(如果您没有看到,确认您是否使隐藏文件可见?该选项可能跟主机设置有关,或者,您创建一个叫做 .htaccess 的文件然后上传)
  8. 文件 .htaccess 内容复制下面代码(也可以将 .htaccess.dist 文件中相关内容取消注释,然后重命名文件为 .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 应该换成您使用的实际文件夹名字。

技术细节

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 不需要设置。根据选项值按照下面说明操作。

参数为 1: 依赖服务器进行 URL 重写

:!: 切记在配置管理器 /start?do=admin&page=config 中设置下面的值

  • 启用美化的 URL: .htaccess
  • URL 中使用斜线作为命名空间分隔符 [x]

否则重写规则不会起作用。

Apache 服务器

重写 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

apachectl status 崩溃问题

Dokuwiki 重写规则影响 apachectl status 命令行,会导致返回 DokuWiki 404 页面而不是服务器状态(server-status)信息,您可以将下面代码放入重写规则而修复该问题

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

或者就是在 DokuWiki 根文件夹(就是doku.php所在的文件夹)创建一个空的服务器状态(server-status)文件。参见论坛文章 Apachectl status is broken with dokuwiki

404 未发现页面错误

您可能需要做这个

IIS (或微软 Azure Web App)服务器

启用 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 App,将下面行放在 web.confg 文件内的 <system.webServer> 标签内(位于您的 App 的 wwwroot 目录)。

IIS 服务器 7.0 或者更高版本

IIS 7.0 或者更高版本服务器可以基于适用于 x86x64URL 重写模块 2.0 进行扩展。

保存上面 .htaccess 文件中适用于 Apache 重写规则(删除 “RewriteBase /dokuwiki” 行)。这不是必需的,因为我们要报规则直接加入到维基根目录。

在 IIS 管理器中选择维基目录,然后选择基于 IIS 的 “URL 重写”(如果您在安装维基前已经打开了管理器,需要刷新一下)

在右侧的操作界面,选择“导入规则”

针对您的配置未建,选择 .htaccess 并导入,您将会得到六条转换后的规则。

最后点击右侧的应用。

基于 .htaccess 规则配置您的维基重写 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 ^/(.*) /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 (OpenBSD) 服务器

参见 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"
  }
}

参数为 2: DokuWiki

在您的 conf/local.php 文件中添加或者修改:

$conf['userewrite'] = 2;

该参数值不需要服务器任何设置。但是改设置依赖 Apache 扩展 CGI 标准的 PATH_INFO 功能。IIS 不能运行,但是最新版的好像可以。

清理 PHP 会话 ID

尽管使用了美化的 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

参见

zh/rewrite.txt · 最后更改: 2021-05-17 09:52 由 hfl

除额外注明的地方外,本维基上的内容按下列许可协议发布: 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