3

Apacheでサブドメインからリポジトリへの変換を設定しようとしています。例:

foobars.domain.com -> /server/svnrepos/foobars

私はこれをmod_rewriteで実行しようとしました:

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.domain\.com$ [NC]
RewriteRule ^/svn(.*) /svn/%2$1 [PT]

ただし、これにより基本的なsvn操作で問題が発生します。「チェックアウト」はこのきれいなことを引き起こします:

$ svn co http://foobars.domain.com/svn
svn: '/svn/foobars/!svn/vcc/default' path not found

サーバーのセットアップ(私のマシン、OSなど)に関して制限はありません。この翻訳をApacheで処理する方法はありますか?大量の仮想ホストを見てきましたが、概念をDAVの場所に拡張する方法がわかりません(VirtualSvnPathがあればいいのに...)。mod_dav_svnが、1)svnリポジトリパスを明示的に定義するか、2)親を定義するように強制する方法は、非常に制限されています。

おそらく、「SVNSpecialURI」はいくつかの有用性があるかもしれませんが、それに関するドキュメントは見つかりません...

私の最終的な目標がサブドメインをSVNPathにマップすることであると仮定すると、私のオプションは何ですか?

参照としての私の現在のconf:

<VirtualHost *:80 *:443>
    ServerAdmin admin@domain.com
    DocumentRoot "/server/www"
    ServerName domain.com
    ServerAlias *.domain.com www.domain.com domain.com
    ErrorLog logs/domain-error_log
    CustomLog logs/domain-access_log common

    DirectorySlash Off

    RewriteLogLevel 9
    RewriteLog /server/log/apache-rewrite.log

    RewriteEngine On
    RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
    RewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.domain\.com$ [NC]
    RewriteRule ^/svn$ /svn/ [QSA]

    RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
    RewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.domain\.com$ [NC]
    RewriteRule ^/svn(.*) /svn/%2$1 [PT]

<Location /svn>
    DAV svn
    SVNParentPath /server/svn
</Location>

4

1 に答える 1

4

オープンソースのために(イェーイ!)、ソリューションを投稿します。問題に対する組み込みの解決策が見つからなかったため、mod_dav_svn.soソースに数時間を費やして、次のパッチを考え出しました。

Index: subversion/mod_dav_svn/mod_dav_svn.c
===================================================================
--- subversion/mod_dav_svn/mod_dav_svn.c        (revision 1049733)
+++ subversion/mod_dav_svn/mod_dav_svn.c        (working copy)
@@ -426,9 +426,14 @@
dav_svn__get_fs_parent_path(request_rec *r)
 {
   dir_conf_t *conf;
+  char *tokens, *subdomain, *last_str;

   conf = ap_get_module_config(r->per_dir_config, &dav_svn_module);
-  return conf->fs_parent_path;
+
+  tokens = apr_pstrdup(r->pool, r->hostname);   // copy hostname
+  subdomain = apr_strtok(tokens, ".", &last_str);
+
+  return (const char *) apr_pstrcat(r->pool, conf->fs_parent_path, "/", subdomain, NULL);
 }

基本的に、これは現在のホスト名を(保留中のリクエスト'request_rec'から)取得し、最初のトークン(サブドメイン)をスライスして、適切なSVNParentPath(conf-> fs_parent_path)と連結します。すべてが正常に機能します。これが私のサーバー構成です(今ではどれほど単純であるかに注意してください):

<VirtualHost *:80 *:443>
    ServerAdmin admin@domain.com
    DocumentRoot "/server/www"
    ServerName domain.com
    ServerAlias *.domain.com www.domain.com domain.com
    ErrorLog logs/domain-error_log
    CustomLog logs/domain-access_log common

    <Location /svn>
        DAV svn
        SVNParentPath /server/svn
        SVNListParentPath on
    </Location>
</VirtualHost>

ノート:

apr_ *関数を正しく使用したことを願っています。注意点がある場合は、フィードバックをお願いします:)

最新のmod_dav_svnツリーを使用してCentosでテストされています。

于 2010-12-17T06:40:04.703 に答える