Apache-2.2

混合 Subversion“SVNParentPath”和每個儲存庫的配置?

  • August 13, 2012

給定一個使用 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基於配置的配置。每個 repo 的 Apache 配置是最小的,尤其是使用類似mod_macro的東西;困難的部分是拆分全域 authz 文件。如果您以前這樣做過,我們將不勝感激。

我討厭在未回答的問題列表中看到我自己的問題,所以這就是我們所做的:

  • 在我們的主伺服器配置中,我們有:
 <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有了這個,採用每個儲存庫的身份驗證和授權配置(而不是這裡使用的全域文件)變得相對容易。

引用自:https://serverfault.com/questions/230253