【问题标题】:Dynamic subversion repos via subdomains (in Apache)通过子域的动态颠覆回购(在 Apache 中)
【发布时间】:2011-05-25 19:10:10
【问题描述】:

我正在尝试在 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>

【问题讨论】:

    标签: apache mod-rewrite subdomain virtual-hosts mod-dav-svn


    【解决方案1】:

    为了开源(耶!),我将发布我的解决方案。我发现我的问题没有内置解决方案,所以我在 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 上测试。

    【讨论】:

      猜你喜欢
      • 2014-03-29
      • 2010-09-15
      • 2011-08-25
      • 2011-03-30
      • 1970-01-01
      • 2014-12-30
      • 2015-10-18
      • 1970-01-01
      • 2016-12-20
      相关资源
      最近更新 更多