チルダ無しでのユーザーDirectory参照

準備

 apacheにrewriteモジュールを組み込む。
例:
% cd /path/to/apache/src
% ./configure --enabele-module=rewrite --enabel-module=so
% make;make install;make clean
 apxsで組み込むなりお好きな様に。

UserDirectoryの設定

 httpd.confに以下の記述を追加。
例(httpd.conf)
<IfModule mod_userdir.c>
    UserDir	/home/*/public_html
</IfModule>
 ~usernameでUserDirectoryにアクセスさせるのでなければ不要。

rewriteの設定

 httpd.conf内の、(VirtualHost等の)対象領域の設定部分に以下の記述を加える。
#mod_rewriteの説明を見る限り、ServerConfigとして全体に適用させる事が出来そうなのだが、どうも出来ない様だ。
例(httpd.conf)
<IfModule mod_rewrite.c>
    RewriteEngine	on
    RewriteLogLevel	0
    RewriteLog	logs/rewrite.log
    RewriteMap	non-tilde-user	prg:/home/rewrite_script.pl
    RewriteRule	^/([^~/]+)/(.*)$	${non-tilde-user:$1|nobody}/$2
</IfModule>
 RewriteMapのprg:以降は、リクエスト書換用スクリプトへのPath。
 次に、rewriteのデータを得るためのスクリプトを用意する。(上の例だと/home/rewrite_script.plとして用意する。)
作成(/home/rewrite_script.pl)
#!/usr/bin/perl

&main;

sub main {
    my	$user_base = '/home/';
    my	$user_dir ='public_html/';
    my	%uid = ();
    my	$name = '';

    $| = 1;

    while (($name) = getpwent) {
        $uid{$name} = 1;
    }

    while (<STDIN>) {
        s/\n//g;
        if ($uid{$_}) {
            print "${user_base}$_/${user_dir}\n";
        } else {
            print "$_\n";
        }
    }
}

1;
 権限を与える。
% cd /path/to/rewrite_script/dir
% chmod 755 rewrite_script.pl