web-dev-qa-db-ja.com

サブディレクトリをSubversionリポジトリにリダイレクトするようにApacheを設定するにはどうすればよいですか?

マシン上の唯一のリポジトリとして設定された古い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>

問題を解決する方法についてのアイデア?

4
Mark S.

簡単な答え: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は、リポジトリが移動され、再度チェックアウトせずに作業コピーを更新したい場合に特に適しています。ただし、これが単純に実行できない状況があることは理解しています。

3
Jeff Snider

Subversionは、残念ながら単純なGETコマンドとPOSTコマンド以上のものを使用するため、リダイレクトするための最良の方法は、Apacheのmod_proxyを使用してリクエストをリバースプロキシすることだと思います。より良い方法があるかどうかはわかりません。

このページで説明されているApache/Subversionリバースプロキシ http://silmor.de/49

0
Philip Reynolds