给定一个典型的使用SVNParentPath的Subversion / Apacheconfiguration,并在/svn/
下托pipe存储库,如下所示:
<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>
有没有办法来覆盖特定的存储库的configuration, 而不必在不同的path上托pipe他们? 也就是说,有没有什么办法可以像这样添加一个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>
…并覆盖 /svn
Location
块提供的configuration? 我在上面的configuration中这样做的尝试在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的方式告诉我,我不能做我想做的事情。 我愿意接受解决scheme或替代scheme!
编辑 :嗯,我可以看到这个问题已经在读者中产生了很多兴奋。 为了logging,我最终可能会为我们现有的所有存储库生成每个存储库configuration,然后放弃基于SVNParentPath
的configuration。 每回购Apache的configuration是最小的,特别是使用类似mod_macro ; 困难的部分将分裂全球authz文件。 如果你以前做过这个,小费是值得赞赏的。
我讨厌在没有回答的问题列表中看到我自己的问题,所以我们做了以下工作:
在我们的主服务器configuration中,我们有:
<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
允许存储库configuration覆盖主要configuration中的<Location /svn/>
,否则会匹配请求。
有了这个,就可以相对容易地采用每个存储库的authentication和授权configuration(而不是这里使用的全局htpasswd
文件)。