如之前在dokuwiki安装配置中所提,Dokuwiki为了方便使用,减少对数据库的依赖,采用的是单文件访问模式,因此挂到网上容易被拖库或者非法篡改。本文将对其访问权限的配置做详细说明。

访问wiki以及在各处快速调用wiki文档的时候会发现两个问题:
  1、域名和本站重复,辨识度不高,后缀为各级目录,安全隐患。
  2、dokuwiki常规Url采用[namespace]的命名方式,后面有多级冒号,不适合作为链接分享。
针对种种问题,本文整理网上各种方法,结合个人尝试,给出针对上述几个问题的配置方法。

二级域名访问

大家通常认为的二级域名可能是:wiki.phower.me这种网址,实际上我们应该称其为‘三级域名’,因为.me才是一个顶级域名。当然说这么多这是便于大家理清各种知识,有的时候避免不必要的名词混淆。

当然本文的任务是将dokuwiki链接到我们的二级域名(dokuwiki.phower.me),实际是个三级域名啦。

实现方法大致有以下两种:
  (1)在主域名下配置重定向规则,让访问域名/doukuwiki目录的请求重写为dokuwiki.phower.me。当然这种对重定向的解释不太准确,如果需要可以详细了解一下重定向原理。
  (2)在自己的主域名下添加子域名(前提是所在的域名商必须允许建立子域名,现在普遍支持5-20个子域名),将其跟IP绑定,相当于新的网站服务器。
  ♦ 本文采用方法二,这种方法可以减轻主站的压力,因为是直接访问服务器,不经过主站中转,也可以提高访问速度。

Step1: 子域名配置

前往自己的域名注册网站,本站是狗爹Godaddy(支持中文,支付宝,价格略贵),在自己的域名服务下建立子域名,如果找不到添加的选项可以直接新建A记录

11

然后就是喝杯咖啡等待一会,等待DNS服务器将你的域名解析传到其他各处DNS服务器,通常几分钟到数小时不等。可以尝试在自己电脑上ping新的子域名,能ping通就没问题了。

在等待域名解析的时候我们可以先准备好Nginx服务器配置。

Step2: Nginx服务器配置

这里大概有两种方法。一是,多个域名规则写一个配置文件里,二是,分别建立多个域名配置文件对应每一个域名。

因为并不想将Wiki作为单独的网站管理,所以将其解析规则放在主站的配置文件里面,以后迁移也比较方便。(两种方法难易程度一致,多文件配置参考nginx 多域名配置

找到主站的虚拟主机配置文件:本机是在目录/usr/local/nginx/conf/vhost
修改phower.me.conf(对应地方修改为自己网站信息)

// 新建一个server区块,放在原来主站的server块后就行
server
    {
        listen 80;
        server_name wiki.example.com;## 这里需要修改成自己的域名
        root /data/dokuwiki;## 这里填真正的wiki目录
        index doku.php index.html index.htm index.php default.html default.htm default.php;

        include enable-php.conf;    //这一行一定不能省略
    }

修改完后重启Nginx服务器,等待域名解析完成就可以通过自己的子域名访问了。
欢迎->>Phower Wiki

安全访问

因为建立了子域名所以有关安全访问的配置移动到主站的配置文件下。之前文章提到的修改nginx.conf方法依然适用,在此主要完善步骤。

• 首先是本地文件的权限设置:

//网站根目录权限遵循:
//文件 644,文件夹 755,权限用户和用户组 www root
//如出现文件权限问题时,请依次执行下面 4 条命令:
cd '目录' //dokuwiki所在目录
chown -R www:root dokuwiki
find dokuwiki/ -type d -exec chmod 755 {} \;
find dokuwiki/ -type f -exec chmod 644 {} \;

• 接下来是Nginx服务器访问权限:官方文档
在上一节中的子域名server块中添加以下代码:

//禁止访问/data,/conf,/bin,/inc
location ~ /(data|conf|bin|inc)/ {
    deny all;
}
//禁止访问.htaccess文件
location ~ /\.ht {
    deny  all;
}
location ~ /\. {
    deny all;
}

如果需要使用xsendfile,则关于四个文件夹的权限可以这么设置

location ~ /(conf|bin|inc)/ {
    deny all;
}
location /data/ {
    internal;
}

重启Nginx服务器,检测是否设置成功:
1、访问http://域名/dokuwiki/data/pages/wiki/dokuwiki.txt 或者在这4个目录下的任意文件,弹出‘403界面’即成功。
2、管理员登陆dokuwiki,进入右上角管理页面,页面中没有出现以下安全性警告的图即为设置成功。

注意:在PC端使用浏览器时,设置好.conf清理一次cookies,否则可能出现上图一直存在的问题。

Url-Rewrite

网址rewrite的目的是为了更加美观,更便于引用和分享。

同样的,在子域名的server块中添加以下代码: 官方文档

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;
}

在dokuwiki中,进入配置设置->高级设置->使用更简洁的url(userewrite)->下拉选择.htaccess
或者修改\dokuwiki\conf\dokuwiki.php

$conf['userewrite']  = 1;

刷新一下,打开一个之前创建的页面,它已经变成了:http://dokuwiki.phower.me/start ,清爽了很多。

但是在多级namespace的情况下,网址还是会出现'/wiki:python:python3:start' 这种后缀,并不方便引用,所以我们还需要再做一点其他操作。

配置设置->高级设置->在 URL 中使用斜杠作为命名空间的分隔符(useslash)->勾选
配置设置->高级设置->使用完全标准的 URL(canonical)->勾选
最后,rewrite的网址变为:http://dokuwiki.phower.me/wiki/python/python3/start

干净,清爽,收工~~~~

最后附上整个子域名server块的配置代码

server
    {
        listen 80;
        server_name wiki.example.com;## 这里需要修改成自己的域名
        root /data/dokuwiki;## 这里填真正的wiki目录
        index doku.php index.html index.htm index.php default.html default.htm default.php;

        include enable-php.conf;

        error_page   404   /404.html;

        location ~ /(data|conf|bin|inc)/ { deny all;}

        location ~ /\.ht { deny  all;}

        location ~ /\. { deny all;}

        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;
        } 
    }

参考 & 致谢

[1] Nginx-URL Rewriting
[2] Nginx-Security