http と https で同じモンを表示 - その2
前回の
として、運用していてssl通信も欲しくなり
- https://rozen.example.com/gin → http://gin.example.com/ の内容を表示
- https://rozen.example.com/kana → http://kana.example.com/ の内容を表示
- https://rozen.example.com/sui → http://kana.example.com/ の内容を表示
としたい。
リバースプロキシつかってもうまく行かなかったよ… orz
という話題。
htmlを単純に配信する鯖であれば、(絶対パスが記述されたファイルが無い限り)ちょこっとエイリアスを書いてあげるだけですんでしまうのですが、ウチの鯖は trac だーの svn だーの mod_uploader だーのが動いている関係でうまくいきません。 確認しているだけで以下の2点が問題です。
- trac は動的に絶対パスを吐く箇所がある (TracEnvParentDir で指定した url で表示される内容がそんな感じ)
- mod_uploader は httpd.conf に http:// / https:// から始まる絶対パスが必要
どうしたものかと悩んだ結果(&アドバイスを頂いた結果)
- 設定ファイルを外部に出す
- その設定ファイルを動的に生成するスクリプトを書いてしまう
「2」はなんのこっちゃいという感じですが、以下のように変数を利用して値が微妙に違うけど殆ど同じ設定ファイルを吐くように仕向けてみました。
<? // : commandline // base_config.php hostname svn_path trac_path [urlprefix] // // : example // base_config.php http://gin.example.jp /path/to/svnrep/ /path/to/tracprj/ // base_config.php https://rozen.example.jp /path/to/svnrep/ /path/to/tracprj/ /gin $svn_path = ""; $trac_path = ""; $urlprefix = ""; $hostname = ""; $url = ""; if($argc < 3) { print "usage :\n"; print "php base_config.php hostname svn_path trac_path [urlprefix]\n"; exit(1); } else { $svn_path = $argv[2]; $trac_path = $argv[3]; $url = $argv[1]; $hostname = preg_replace("/https?:\/\/([[:alnum:]\.]+?)/", "$1", $argv[1]); if($argc >= 5) $urlprefix = $argv[4]; } # require "/" at head if($urlprefix != "" && substr($urlprefix, 0, 1) != "/") $urlprefix = "/" . $urlprefix; print <<< __CONFIG_OUT__ #------------------------------------------------- # subversion # /svnrep で subversion リポジトリへアクセス #------------------------------------------------- <Location ${urlprefix}/svnrep> DAV svn SVNParentPath ${svn_path} SVNListParentPath on </Location> #------------------------------------------------- # trac # /tracprj で tracプロジェクトページ へアクセス #------------------------------------------------- <Location ${urlprefix}/tracprj> SetHandler mod_python PythonHandler trac.web.modpython_frontend PythonOption TracEnvParentDir ${trac_path} PythonInterpreter main_interpreter PythonOption TracUriRoot ${urlprefix}/tracprj </Location> <LocationMatch "${urlprefix}/tracprj/[^/]+/login"> AuthType Digest AuthName "Trac" AuthDigestProvider file AuthUserFile /path/to/.htdigest Require valid-user </LocationMatch> #------------------------------------------------- # uploader #------------------------------------------------- <Location ${urlprefix}/uploader> SetHandler uploader UploaderBaseUrl ${url}${urlprefix}/uploader UploaderDataDirectory "/path/to/up_${hostname}/data" UploaderFileDirectory "/path/to/up_${hostname}/file" UploaderThumbDirectory "/path/to/up_${hostname}/thumb" UploaderTempDirectory "/path/to/up_${hostname}/temp" UploaderTotalFileSizeLimit 15728640 UploaderTotalFileNumberLimit 200 UploaderFileSizeLimit 2097152 UploaderPerPageItemNumber 20 UploaderIndexViewTemplate "/path/to/tmpl/index.htm" UploaderProgressViewTemplate "/path/to/tmpl/progress.htm" UploaderDownloadViewTemplate "/path/to/tmpl/download.htm" UploaderThumbnailViewTemplate "/path/to/tmpl/thumbnail.htm" UploaderAdminViewTemplate "/path/to/tmpl/admin.htm" UploaderErrorViewtemplate "/path/to/tmpl/error.htm" </Location> <Location ${urlprefix}/uploader/admin> Order Deny,Allow Deny From All Allow From 127.0.0.1 Allow From 192.168.169.0/25 </Location> Alias ${urlprefix}/up_img "/path/to/img" Alias ${urlprefix}/up_css "/path/to/css" Alias ${urlprefix}/up_js "/path/to/js" __CONFIG_OUT__; ?>
ヒアドキュメントマジ便利。
このスクリプトに対して適切なパラメータを与えファイルを生成します。そしてそいつを httpd.conf から Include してあげれば、目的は達成できます。すばらしい! *1
でも、大問題発生
mod_uploader って、設定ごとの uploader インスタンス生成すんのねこれ。 orz
たとえば、以下のURLで同じアップローダーへたどり着けるとします。
ここで、https:// でファイル上げた後に http:// のアップローダーへいくと、上げられたはずのファイルが無いんです。
ディスク的には同じ場所を読み書きしにいっていますが、ローダー的には https:// & http:// で2つのアップローダー管理インスタンスが生成されており、https:// で行われた変更なんざ http:// で知る由もなしなわけで…。
… orz
まぁ、何が言いたいのかって、風邪引きながら文書くなってことさ。(ぉ orz