混合颠覆“SVNParentPath”和每个存储库配置?

lar*_*sks 9 http svn version-control authorization apache-2.2

给定使用 SVNParentPath 的典型 Subversion/Apache 配置,存储库托管/svn/如下:

<Location /svn>
    DAV svn

    SVNParentPath /srv/source/svn/repos
    SVNReposName "Subversion Repository"

    AuthzSVNAccessFile /srv/source/svn/authz
    Satisfy Any

    AuthType                Basic
    AuthBasicProvider       file
    AuthName "Subversion Repository"
    AuthUserFile /srv/source/svn/htpasswd

    Require valid-user
</Location>
Run Code Online (Sandbox Code Playgroud)

有没有办法覆盖特定存储库的此配置,而不必将它们托管在不同的路径上?也就是说,有什么办法可以添加这样的Location块...

<Location /svn/my_special_repo>
    SVNPath /srv/source/svn/repos/my_special_repo
    AuthzSVNAccessFile /srv/source/svn/repos/my_special_repo/conf/authz
</Location>
Run Code Online (Sandbox Code Playgroud)

...并让它覆盖Location块中提供的配置 /svn?我尝试使用上述配置执行此操作时,在 Apache 错误日志中遇到了奇怪且无用的错误,例如:

[Wed Feb 02 11:28:35 2011] [error] [client 10.10.209.120]
(20014)Internal error: Can't open file '/srv/source/svn/repos/svn/format':
No such file or directory
Run Code Online (Sandbox Code Playgroud)

所有这些似乎都是 mod_dav_svn 告诉我我不能做我想做的事情的方式。我愿意接受解决方案或替代方案!

编辑:嗯,我可以看到这个问题在读者中引起了很多兴奋。为了记录,我最终可能要做的是为我们所有现有的存储库生成每个存储库的配置,然后放弃SVNParentPath基于配置的配置。per-repo Apache 配置是最小的,尤其是使用类似mod_macro 的东西;困难的部分将拆分全局 authz 文件。如果您以前这样做过,请提供提示。

lar*_*sks 4

我讨厌看到自己的问题在未回答的问题列表中徘徊,所以我们做了以下事情:

  • 在我们的主服务器配置中,我们有:

      <Location /svn/>
            SVNParentPath /srv/source/svn/repos
      </Location>
    
    Run Code Online (Sandbox Code Playgroud)
  • 我们采用以下方法mod_macro在新存储库中复制此行为:

    <Macro LegacySubversionRepo $name>
        # Override SVNParentPath block in main vhost config.
        RewriteRule ^/svn/$name /repo/$name [PT]
    
        <Location /repo/$name>
                Order                   deny,allow
                Allow                   from all
    
                Use LdapAuth \
                        "$name svn repository" \
                        /srv/source/svn/htpasswd
    
                DAV svn
                SVNPath /srv/source/svn/repos/$name
                AuthzSVNAccessFile /srv/source/svn/authz
                SVNAutoversioning On
                Satisfy Any
        </Location>
    </Macro>
    
    Run Code Online (Sandbox Code Playgroud)

    允许RewriteRule存储库配置覆盖<Location /svn/>主配置中的 ,否则将与请求匹配。

有了这个,采用每个存储库的身份验证和授权配置(而不是htpasswd此处使用的全局文件)就变得相对容易。