マシン上の唯一のリポジトリとして設定された古いSubversionリポジトリがあります。次のようなURLにアクセスしました。
http://myserver.com/svn/trunk/...
http://myserver.com/svn/branches/...
Apache2のdav-svnインストールでいくつかのリポジトリが設定されている新しいサーバーに移動しているため、デフォルトでは次のようにアクセスします。
http://myserver.com/svn/repo/trunk/
http://myserver.com/svn/repo/branches/
or
http://192.168.0.1/svn/repo/trunk/
http://192.168.0.1/svn/repo/branches/
URLを変更せずに古いリポジトリを新しいマシンに移動する必要があるため、リポジトリを設定してから、URLに応じてApacheにリダイレクトさせます。
http://myserver.com/svn/trunk
にリダイレクトします
http://myserver.com/svn/repo/trunk
透過的に。 IPベースのURLにリダイレクトすることはできますが、ドメイン名自体を使用してリダイレクトしようとすると、禁止メッセージまたは「要求されたSVNファイルシステムを開けませんでした」というメッセージが表示されます。
<VirtualHost *:80>
ServerName myserver.com
ServerAlias www.myserver.com
DocumentRoot /var/www/vhosts/myserver.com/html
CustomLog /var/www/vhosts/myserver.com/logs/access_log combined
ErrorLog /var/www/vhosts/myserver.com/logs/error_log
RewriteEngine On
RewriteRule ^/svn(.*)$ /svn/myrepo$1 [L,QSA]
# THE FOLLOWING WORKS, BUT IS NOT TRANSPARENT
# RewriteRule ^/svn(.*)$ http://192.168.0.1/svn/myrepo$1 [L,QSA]
<Directory /var/www/vhosts/myserver.com/html>
AllowOverride All
</Directory>
</VirtualHost>
そしてSubversion.confファイル:
<Location /svn>
DAV svn
SVNParentPath /var/svn/repository
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /var/svn/repository/.htpasswd
Require valid-user
</Location>
問題を解決する方法についてのアイデア?
簡単な答え:RewriteRuleでPT
フラグを使用します。
まず、Apacheのちょっとした裏話。 Apacheがリクエストを受信すると、そのリクエストをローカルストレージにマッピングするプロセスを通過します。その後、Apacheには実際にあなたが要求したものに関する2つのデータがあります。リクエストのURLとファイルパス。したがって、/svn/blah
のリクエストは/var/www/vhosts/myserver.com/html/svn/blah
に変換され、そのパスは個別に保存されます。 mod_rewriteを使用すると、この動作を微調整して、必要な場所にURLをルーティングできます。
さて、あなたが持っている2つのRewriteRulesは、暗黙のうちに異なることをしています。
あなたが持っている最初のものは書き直しです。 /svn/blah
のようなURLを取り、上記の動作を使用する代わりに、実際に/svn/myrepo/blah
を要求したかのようにマップするため、結果のファイルパスは/var/www/vhosts/myserver.com/html/svn/myrepo/blah
になります。ただし、ここに問題があります要求されたURLは変更されません。リクエストのURLはまだ/svn/blah
ですが、Apacheは、ファイルが.../svn/myrepo/blah
ではなく.../svn/blah
にあると考えています。
なぜこれがあなたが尋ねる問題なのですか? Subversionモジュールはファイルパスを使用しないためです。リクエストのURLを調べます。したがって、Apacheとmod_rewriteは、mod_dav_svnがそれを無視するため、これらすべてを実行するのに時間を浪費しました。必要なのは、mod_rewriteがリクエストURLを変更することです。そして、それがPT
が行うことです。リクエストURLとファイルパスの両方を変更するため、後でmod_dav_svnに到達すると、変更されたURLが表示されます。
2つ目はリダイレクトです。置換はhttp://
で始まり、Apacheには192.168.0.1
という名前の仮想ホストがないため、実際にはフラグにR
を入れるつもりだったと想定します。これは、それを変換できないためです。ファイルパスに。これは、Subversionクライアントに「Hey、it's over here」メッセージを送り返し、別の要求を行っています。
さて、そうは言っても、mod_rewriteに他のリポジトリのURLをスキップさせる何かをしない限り、この設定ではとにかくそこに複数のリポジトリが存在することはありません。 mod_rewriteは、毎回/svn/bignewproject/blah
を/svn/myrepo/bignewproject/blah
に元気よく変更します。次のようなルールをRewriteRuleの前に追加できます。
RewriteRule ^/svn/(myrepo|myotherrepo|coolproject|stuff|etc)/ - [S=1]
これにより、次のルールがスキップされます。ただし、これからは手作業で更新していきます。 RewriteCondの魔法で自動化されたものを実行できるかもしれませんが、おそらく注意が必要です。私はそれについてあまりよく知らないので、誰か他の人があなたを助けなければならないでしょう。
これが少数の人々によってのみ使用される場合は、この書き換えを完全にスキップして、全員の作業コピーを更新する方がよい場合があります。 svn switch --relocate
は、リポジトリが移動され、再度チェックアウトせずに作業コピーを更新したい場合に特に適しています。ただし、これが単純に実行できない状況があることは理解しています。
Subversionは、残念ながら単純なGETコマンドとPOSTコマンド以上のものを使用するため、リダイレクトするための最良の方法は、Apacheのmod_proxyを使用してリクエストをリバースプロキシすることだと思います。より良い方法があるかどうかはわかりません。
このページで説明されているApache/Subversionリバースプロキシ http://silmor.de/49