2010-12-15 110 views
3

我試圖在Apache中設置子域到存儲庫的轉換。例如:通過子域名(在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 

我沒有在服務器設置方面的任何限制(我的機器,操作系統等)。有沒有辦法讓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)連接起來,然後瞧!一切正常。這裏是我的服務器配置(注意現在是多麼簡單):

<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_ *正常工作,如果有什麼注意事項,我想要一些意見: )

使用最新的mod_dav_svn樹對Centos進行測試。