目次

,

dokuwiki を reverse proxy の後ろで運用する

こんな設定でいきます。

reverse proxy の設定

server {
    location / {
        proxy_pass http://ip.addr.back.end/dokuwiki/;
    }
}

dokuwiki に限らず nginx を reverse proxy として使う場合は、proxy_pass の url の書き方に注意する必要があります。

proxy_pass http://ip.addr/back.end/dokuwiki/;

……と書くのと、

proxy_pass http://ip.addr/back.end/dokuwiki;

……と、最後のスラッシュを省いて書くのとでは、意味が違うみたいです。nginx 本家

バックエンド のサーバーの設定

dokuwiki 一式は /path/to/htdocs/dokuwiki に展開されています。

server {
    listen  ip.addr.back.end;
    root    /path/to/htdocs;

    location /dokuwiki/ {
        index doku.php;
        try_files $uri $uri/ @dokuwiki;
    }

    location @dokuwiki {
        rewrite
            ^/dokuwiki/_media(.*)
            /dokuwiki/lib/exe/fetch.php?media=$1 last;
        rewrite
            ^/dokuwiki/_detail/(.*)
            /dokuwiki/lib/exe/detail.php?media=$1 last;
        rewrite
            ^/dokuwiki/_export/([^/]+)/(.*)
            /dokuwiki/doku.php?do=export_$1&id=$2 last;
        rewrite
            ^/dokuwiki/(?!lib/)(.*)
            /dokuwiki/doku.php?id=$1&$args last;
    }

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

    :
    :
}

……と、バックエンドサーバーの document root を /path/to/htdocs/dokuwiki にしたくなかったので、こんな感じの設定になってます。

あとは、/path/to/dokuwiki/lib/local.php で、以下の設定を行います。

$conf['baseurl'] = 'http://reverseproxy/';
$conf['basedir'] = '/';

これで http://reverseproxy/ にアクセスすると http://ip.addr.back.end/dokuwiki/start にアクセスした時と同じ結果を得ることができます。 ただし http://ip.addr.back.end/dokuwiki/ の url からはマトモにアクセスできなくなります……両立はちょっと厳しそうです。