我正在尝试在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操作出现问题; 'checkout'导致了这件好事:
$ 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 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>
答案 0 :(得分: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上测试。