Apache 1.3.x までは
<VirtualHost xxx>
User user
Group group
UserDir public_html
ServerName xxx
DocumentRoot /home/vhost/xxx
<VirtualHost vhost>
等となってた場合、
http://xxx/ での CGI の実行 uid/gid は user/group となり、
http://xxx/~aaa/ での CGI の実行 uid/gid は aaa のものとなる。
これが僕が望む動作なのだが、
Apache 2.x の suexec から VirtualHost での CGI の実行 uid/gid は、
新たに出来た mod_suexec による SuexecUserGroup ディレクティブで行うようになった。
で、これが今までと同じ動作をすると信じて以下のようにした。
<VirtualHost xxx>
SuexecUserGroup user group
UserDir public_html
ServerName xxx
DocumentRoot /home/vhost/xxx
<VirtualHost vhost>
しかし、これをやったら http://xxx/~aaa/ での CGI の実行が出来なくなってしまった。
suexec_log によると user/group で実行しようとしたがファイルの所有者は aaa/aaa
となっており実行は許可されなかった、とある。
SuexecUserGroup ディレクティブで設定したほうが UserDir での suexec より優先され
るようになってしまったのである。
ユーザ権限で CGI が動いてもらわないと困るからとりあえず SuexecUserGroup を
コメントアウトした。
そしたら当然 UserDir での suexec は動くようになったが、
今度は UserDir でない CGI (http://xxx/hoge.cgi等) が動かなくなってしまう…。
まさに「あちらを立てればこちらが立たず」な状態。
参ってしまうなこれは…。
suexec.c にパッチ当てようとも思ったが、そこまでするのも面倒なので
結局次のような設定にしてなんとか完了。
<VirtualHost xxx2>
SuexecUserGroup user group
UserDir disable
ServerName xxx2
DocumentRoot /home/vhost/xxx
<VirtualHost vhost>
<VirtualHost xxx>
UserDir public_html
ServerName xxx
DocumentRoot /home/vhost/xxx
Redirect /hoge.cgi http://xxx2/hoge.cgi
<VirtualHost vhost>
こんな感じ必要な CGI に対して Redirect でもうひとつでっち上げた VirtualHost に
飛ばして逃げ。
一応ちゃんと動いてます。