我正在尝试在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回购path,或2)定义父母,是非常有限的。
也许'SVNSpecialURI'可以有一些使用,虽然我找不到任何文档…
假设我的最终目标是将子域映射到SVNPath,我有什么select?
我目前的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>
为了开源(yay!),我将发布我的解决方案。 我发现没有内置的解决方案,所以我花了几个小时在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。