http と https で同じモンを表示 - その2

前回の

として、運用していてssl通信も欲しくなり

としたい。

リバースプロキシつかってもうまく行かなかったよ… orz

という話題。

htmlを単純に配信する鯖であれば、(絶対パスが記述されたファイルが無い限り)ちょこっとエイリアスを書いてあげるだけですんでしまうのですが、ウチの鯖は trac だーの svn だーの mod_uploader だーのが動いている関係でうまくいきません。 確認しているだけで以下の2点が問題です。

  • trac は動的に絶対パスを吐く箇所がある (TracEnvParentDir で指定した url で表示される内容がそんな感じ)
  • mod_uploader は httpd.conf に http:// / https:// から始まる絶対パスが必要


どうしたものかと悩んだ結果(&アドバイスを頂いた結果)

  1. 設定ファイルを外部に出す
  2. その設定ファイルを動的に生成するスクリプトを書いてしまう

「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

*1:実はエイリアスの設定とかちょっと必要だけど