わりとちゃんとTracを使い出したので、複数プロジェクトの管理についてちゃんと考えてみた。
ガイドをみるとTracEnvParentDirを使えと書いてある。
SetHandler mod_python PythonHandler trac.web.modpython_frontend PythonOption TracEnvParentDir /var/trac PythonOption TracUriRoot /projects
こうしておいて/projectsにアクセスするとAvailable Projectsが見れる。
じゃあ、認証はどうするんだと言えば、LocationMatchで共通の認証ファイルを見るようにする例しか書いてない。
AuthType Basic AuthName "Trac" AuthUserFile /var/trac/.htaccess Require valid-user
全プロジェクトで共通の認証ファイルというのはさすがにありえないし、Tracプロジェクトを追加するごとにconfに追記してapacheをリスタートとか、そういう運用設計はいやだったので、以下のように試行錯誤。
1. LocationMatchで後方参照
まず、LocationMatchで正規表現が使えてるんだから、後方参照が使えないかと期待して、公式のドキュメントをあたってみるも何も記述無し。
書いてないだけかと前向きに捉えてGで調べてみたら、404 Not Foundで後方参照が使える旨の記述があったので試してみる。
AuthType Basic AuthName "Trac" AuthUserFile /var/trac/$1/.htaccess Require valid-user
結果は失敗。$1は展開されず、そのままの文字列でパスを探しにいってしまう。stackasteriskには一応フィードバックしておいた。
2. SetEnvIfでゴニョゴニョ
で、さらにApacheのドキュメントを読んでいるとSetEnvIfは正規表現が使えて、後方参照も使えて、さらに環境変数にも入れられるということだったので、次はSetEnvIfを試してみる。
SetEnvIf Request_URI "/trac/([^/]+)/login" TRAC_EACH_PJ_NAME=$1AuthType Basic AuthName "Trac Authentication" AuthUserFile /home/trac/%{TRAC_EACH_PJ_NAME}e/trac.htpasswd Require valid-user
が、これも失敗。LocationMatchのAuthUserFileのなかでは環境変数は展開してくれない。そもそも展開方法を書いてなくて、LogFormatでの書式でムリクリ"%{TRAC_EACH_PJ_NAME}e"って書いてみてただけだし。
ということで、結局ムリということでした。
結果
悲しいけど、できないのは仕方ないので今は以下のようなかたちで運用中。
SetHandler mod_python PythonHandler trac.web.modpython_frontend PythonOption TracEnvParentDir /var/trac PythonOption TracUriRoot /projects # 以下、プロジェクトが増えるごとに追記AuthType Basic AuthName "foo project" AuthUserFile /var/trac/foo/.htaccess Require valid-user AuthType Basic AuthName "bar project" AuthUserFile /var/trac/bar/.htaccess Require valid-user
まー、Tracプロジェクト構築スクリプト作ってて、それに、自動で追記させてapacheのリスタートまでさせるようにしてるから手間はかわらないんだけど、精神衛生上イヤだなと。
あとは自前でLocationMatchをパクったようなモジュール書くとかかー。Cはまったくわからないけど。