2010-12-15 10 views
3

Apacheでサブドメインからリポジトリへの変換を設定しようとしています。例:私はこれがのmod_rewriteで行わ取得しようとしましたサブドメイン経由の動的Subversionリポジトリ(Apache)

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

:しかし、これは基本的なSVN操作で問題が発生し

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

。 'checkout'は、このかなりの事を引き起こします:

$ 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 repoパスを定義するか、または2)親を定義するかのどちらかに強制する方法は非常に限定されています。

私はそれ上の任意のドキュメントを見つけることができませんが、おそらく「SVNSpecialURI」は、いくつかの使用のものとすることができる...

は私の究極の目標は何ですか、SVNPathにサブドメインをマッピングすることであると仮定すると、私のオプション?参照として

私の現在のconf:オープンソースの関心で

<VirtualHost *:80 *:443> 
    ServerAdmin [email protected] 
    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

(!イェーイ)、私は私の解決策を投稿します。私は私の問題への組み込みの解決策を見つけていないので、私は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)およびvoilaと連結します。すべてが必要なように機能します。ここに私のサーバ設定は、(それが今どのようにシンプルに気づく)です:

<VirtualHost *:80 *:443> 
    ServerAdmin [email protected] 
    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_ *関数を使用していたすべての注意事項がある場合は、私はいくつかのフィードバックが欲しいことを願っています: )

Centosで最新のmod_dav_svnツリーでテスト済みです。

関連する問題