リバースプロキシ設定
私の環境では外部向けに公開している Apache の入っているホストとは別のホスト上に、SVN のリポジトリを作成しました。
このままでは外部から SVN リポジトリにアクセスできないため、リバースプロキシを設定して https://svn.〜/ のときに SVN リポジトリの入っているホストにリクエストを転送するようにしました。
SVN リポジトリの入っているホストでは、WebDAV プロトコルを使用した SVN との連携を設定済みです。
snares:/etc/httpd/conf.d/vhosts/vhosts.conf
<Location /> DAV svn SVNPath /mnt/repositories@chinstrap/svn #<LimitExcept GET PROPFIND OPTIONS REPORT> SSLRequireSSL AuthType Basic AuthName "Authorization Realm" AuthUserFile /mnt/repositories@chinstrap/svn/conf/htpasswd Require valid-user #</LimitExcept> </Location>
Basic 認証をつかっているため、SSL 以外ではコミットなどの作業をできないように設定しています。
このため、リバースプロキシの設定もアクセスされたのが http の場合は http に、https の場合は https に転送するようにしています。
http://d.hatena.ne.jp/NetPenguin/20081127#p1 にあるように、ファイルを分割して仮想ホスト+SSLの設定をしていますのでリライトの設定についても SSL の有無に関係なく一か所で済むようにします。編集対象としているファイルの詳細については、http://d.hatena.ne.jp/NetPenguin/20081127#p1 のエントリを参照してください。
rockhopper:/etc/httpd/conf.d/vhosts/vhosts.conf
外部からの SVN リポジトリへのアクセスを受け付ける仮想ホストを用意します。
<VirtualHost *:80> Include conf.d/vhosts/svn.netpenguin.org.part ErrorLog logs/svn.netpenguin.org.error_log CustomLog logs/svn.netpenguin.org.access_log combined </VirtualHost> <VirtualHost *:443> Include conf.d/vhosts/ssl.part Include conf.d/vhosts/svn.netpenguin.org.part ErrorLog logs/svn.netpenguin.org.error_log CustomLog logs/svn.netpenguin.org.access_log combined CustomLog logs/svn.netpenguin.org.ssl_request_log ssl_request
rockhopper:/etc/httpd/conf.d/vhosts/svn.netpenguin.org.part
外部からの SVN アクセスを、実際に SVN リポジトリを公開しているサーバに転送します。
外部向けに登録している SVN サーバのホスト名も、内部のホスト名も svn.netpenguin.org なので紛らわしいですが、RewriteRule に記述している https://svn.netpenguin.org/ は内部向けに用意している DNS によって解決され、そのアドレスはプライベート IP (SVN リポジトリを公開しているホストの IP アドレス)になります。
ServerName svn.netpenguin.org SSLProxyEngine On RewriteEngine On ProxyRequests Off RewriteCond %{HTTPS} on [NC] RewriteRule ^/(.*) https://svn.netpenguin.org/$1 [P] RewriteCond %{HTTPS} off [NC] RewriteRule ^/(.*) http://svn.netpenguin.org/$1 [P]
この設定では、HTTPS によるアクセスを扱うために SSLProxyEngine On を指定し、また http でのアクセスは http のまま、https でのアクセスは https として転送するために、RewriteCond %{HTTPS} on (あるいはoff)の指定によって適用するリライトルールを分けています。
実際に外部(e-mobile経由)から試してみましたが、問題なく SVN リポジトリにアクセスできました。
ちなみに、単純にリバースプロキシを構築するだけであれば、RewriteRule ではなく ProxyPass の設定だけで十分かと思います。
あと、本来であれば ProxyPassReverse も設定した方が良いのですが、SVN リポジトリへのアクセスでリダイレクト等は発生しないだろうと思い未設定です。これを設定する場合、同じ記述での http/https 両対応が難しそうなので http アクセスの場合は https にリダイレクトさせてしまい、それから ProxyPass によって https://〜 に転送、ProxyPassReverse も https://〜 で設定という流れにするかと思います。(ためしてないけど)
一つのグローバルIPで自鯖を立てている環境では、仮想ホストとリバースプロキシは必須だなぁと実感してたりします。あと、無料の DynamicDNS サービスも。