给定一个使用 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>
有没有办法覆盖特定存储库的配置没有必须将它们托管在不同的路径上吗?也就是说,我有什么办法可以添加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>
...并拥有它覆盖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
这一切似乎都是 mod_dav_svn 告诉我我无法完成我想做的事情。我愿意接受解决方案或替代方案!
编辑:好吧,我可以看到这个问题在读者中引起了很大的兴奋。为了记录,我最终可能会为我们现有的所有存储库生成每个存储库的配置,然后放弃SVNParentPath
基于配置。每个存储库的 Apache 配置是最小的,尤其是使用类似mod_macro;最难的部分是拆分全局 authz 文件。如果您之前做过这件事,欢迎提供提示。
答案1
我不想看到我自己的问题被搁置在未解答问题列表中,因此我们采取了以下措施:
在我们的主服务器配置中,我们有:
<Location /svn/> SVNParentPath /srv/source/svn/repos </Location>
我们采取以下措施
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>
允许
RewriteRule
存储库配置覆盖<Location /svn/>
主配置中原本与请求匹配的配置。
有了这个,采用每个存储库的身份验证和授权配置(而不是htpasswd
这里使用的全局文件)就变得相对容易。