我的每个存储库都有一个重复的身份验证块,我想知道是否有办法重用该块并优化我们的设置。
此设置使我们能够浏览 code.domain.com 来查看所有存储库并浏览源代码(因为所有存储库都是开放的,可供读取)。
以下是我的当前配置:
<VirtualHost *:80>
DocumentRoot /u01/subversion/repositories
ServerName code.domain.com
ServerAdmin [email protected]
<Location />
Options Indexes MultiViews FollowSymLinks IncludesNoExec
Order allow,deny
Allow from all
</Location>
<Location /repoA>
DAV svn
SVNPath /u01/subversion/repositories/repoA
SVNIndexXSLT "/share/svnxslt/svnindex.xsl"
AuthzSVNAccessFile /u01/subversion/svnrepos.acl
AuthName "Source Code Repository / Repertoire de code"
AuthBasicProvider ldap
AuthType Basic
AuthzLDAPAuthoritative off
AuthLDAPURL "ldap://domain.com?sAMAccountName" NONE
AuthLDAPBindDN "bindDN"
AuthLDAPBindPassword bindPwd
Satisfy Any
Require valid-user
</Location>
# duplicated Location for repoB, repoC, etc...
</VirtualHost>
我找到了这个(并实现了它),但是,我收到以下错误:
[2013 年 7 月 26 日星期五 14:41:37] [错误] [客户端 xxxx] (25) 设备的 ioctl 不适当:URI 不包含存储库的名称。[403,#190001]
配置文件:
<VirtualHost *:80>
DocumentRoot /u01/subversion/repositories
ServerName code.domain.com
ServerAdmin [email protected]
<Location />
Options Indexes MultiViews FollowSymLinks IncludesNoExec
Order allow,deny
Allow from all
DAV svn
SVNParentPath /u01/subversion/repositories
AuthBasicProvider ldap
AuthzLDAPAuthoritative Off
AuthLDAPURL "ldap://domain.com?sAMAccountName" NONE
AuthLDAPBindDN "bindDN"
AuthLDAPBindPassword "bindPwd"
AuthType Basic
AuthName "Use your sAMAccountName to connect. If you're unsure, write to [email protected]."
</Location>
<Location /repoA>
SVNPath /u01/subversion/respositories/repoA
Satisfy Any
require valid-user
</Location>
# Other Locations for each repoB, repoC, etc...
</VirtualHost>
最坏的情况是,我想我会保留冗余配置。
更新 #1
快到了...但是无法浏览域的根目录 - 出现 401 错误...
<VirtualHost *:80>
ServerName code.domain.com
ServerAdmin [email protected]
DocumentRoot /u01/subversion/repositories/
<Directory /u01/subversion/repositories/>
Options Indexes MultiViews FollowSymLinks IncludesNoExec
Order allow,deny
allow from all
</Directory>
<Location />
AuthBasicProvider ldap
AuthType Basic
AuthzLDAPAuthoritative off
AuthName "SVN Repository. Authorization required."
AuthLDAPBindDN "bindDN"
AuthLDAPBindPassword "bindPwd"
AuthLDAPURL "ldap://domain.com?sAMAccountName" NONE
AuthzSVNAccessFile /u01/subversion/svnrepos.acl
SVNParentPath /u01/subversion/repositories
Satisfy Any
Require valid-user
</Location>
<Location /repoA>
DAV svn
SVNPath /u01/subversion/repositories/repoA
SVNIndexXSLT /share/svnxslt/svnindex.xsl
</Location>
# Other Locations
</VirtualHost>
更新 #2
当我仅浏览根目录时,出现此错误:
Directory index forbidden by Options directive: /u01/subversion/repositories/
但是,我看到 Indexes 存在于 Directory 指令的 Option 声明中......
更新 #3(Lazy Badger 提出的解决方案)
当我访问根目录时,我看到的是 .xsl 和 .css 文件,而不是存储库。但是,/svn/ 将列出存储库,但最终目标是让 /svn/ 成为站点的根目录。
<VirtualHost *:80>
...
# /u01/subversion-docs is where .xsl and .css reside
DocumentRoot "/u01/subversion-docs"
<Directory />
Options Indexes MultiViews FollowSymLinks IncludesNoExec
AllowOverride None
Order allow,deny
Allow from all
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/svn$
RewriteRule ^(.*/svn)$ %1/ [R=301,L]
</Directory>
<Location /svn/>
DAV svn
SVNListParentPath on
SVNParentPath /u01/subversion/repositories
SVNIndexXSLT "/svnindex.xsl"
...
Satisfy Any
require valid-user
</Location>
</VirtualHost>
答案1
我很抱歉,但是你必须阅读并记住一些 ABC前更深入
- 单
<Location>
罐处理任何Subversion 存储库的数量(如果它们是公共目录的子目录) - 单个 AuthzSVNAccessFile 可以处理任何这些存储库中的存储库和路径的数量
- 如果没有明确重新定义,则容器中定义的指令
<Location>
将在位置的子路径中继承
如果你的业务任务确实
拥有一组具有常见 LPAD 身份验证和基于 XSLT 的 HTML 页面模板以及基于路径的授权的存储库
让我们将我的丑陋草稿(使用 VisualSVN 服务器默认配置,跳过不太重要的部分)转化为适合您案例的功能解决方案
...
ServerRoot SOME/PATH/TO/SERVER
...
DocumentRoot "htdocs"
...
<Directory />
Options FollowSymLinks
AllowOverride None
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/svn$
RewriteRule ^(.*/svn)$ %1/ [R=301,L]
</Directory>
...
<Location /svn/>
DAV svn
SVNListParentPath on
SVNParentPath /PATH/TO/PARENT/OF/REPO/DIR
SVNIndexXSLT "/svnindex.xsl"
...
AuthName
AuthType Basic
AuthBasicProvider file
AuthUserFile "...htpasswd"
AuthzSVNAccessFile "...authz"
Satisfy Any
require valid-user
...
</Location>
...
笔记
- 定义 ServerRoot 以便稍后使用相对路径
- DocumentRoot 以后与 DAV 位置不相关,它是站点的普通部分(不是 WebDAV),其中包含 SVNIndexXSLT 指令的模板
- WebDAV 位置已移出站点根目录,以便为普通 http 保留站点的“正常”部分
第一个变化:基本身份验证被 LDAP 身份验证取代
<Location /svn/>
DAV svn
SVNListParentPath on
SVNParentPath /PATH/TO/PARENT/OF/REPO/DIR
SVNIndexXSLT "/svnindex.xsl"
...
AuthBasicProvider ldap
AuthType Basic
AuthzLDAPAuthoritative off
AuthName "SVN Repository. Authorization required."
AuthLDAPBindDN "bindDN"
AuthLDAPBindPassword "bindPwd"
AuthLDAPURL "ldap://domain.com?sAMAccountName" NONE
AuthzSVNAccessFile "...authz"
Satisfy Any
require valid-user
...
</Location>
第二次改变:SVNParentPath
<Location /svn/>
DAV svn
SVNListParentPath on
SVNParentPath /u01/subversion/repositories/
SVNIndexXSLT "/svnindex.xsl"
第三次改变:ServerRoot+DocumentRoot
以某种方式定义这些根,不要忘记将 svnindex.xsl 和所有其他需要的文件放置在 DocumentRoot
第四次变革
将 ACL 添加到 AuthzSVNAccessFile,将路径写入 repo 集合中[REPO:/PATH/IN/REPO]
答案2
我在生产环境中使用以下配置
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName svn.example.net
DocumentRoot /vhosts/svn.example.net/
<Directory /vhosts/svn.example.net/>
Options -Indexes
AllowOverride None
Order allow,deny
allow from all
</Directory>
<Location />
AuthBasicProvider ldap
AuthType Basic
AuthzLDAPAuthoritative on
AuthName "SVN Repository. Authorization required."
AuthLDAPGroupAttribute memberUid
AuthLDAPGroupAttributeIsDN off
AuthLDAPBindDN uid=w3-ldap_reader,ou=system,ou=users,dc=example,dc=net
AuthLDAPBindPassword 7654321
AuthLDAPURL ldap://127.0.0.1/dc=example,dc=net?uid?sub
Require ldap-group cn=svn,ou=groups,dc=example,dc=net
</Location>
<Location /Soft>
DAV svn
SVNPath /svn/soft
AuthzSVNAccessFile /etc/svn/svn-soft.conf
SVNReposName "Software repository."
SVNIndexXSLT "/svnindex.xsl"
</Location>
<Location /Education>
DAV svn
SVNPath /svn/education
AuthzSVNAccessFile /etc/svn/svn-edu.conf
SVNReposName "Education repository."
SVNIndexXSLT "/svnindex.xsl"
</Location>
<Location /Vacation>
DAV svn
SVNPath /svn/vacation
AuthzSVNAccessFile /etc/svn/svn-vacation.conf
SVNReposName "Vacation repository."
SVNIndexXSLT "/svnindex.xsl"
</Location>
<Location /NDA>
DAV svn
SVNPath /svn/NDA
AuthzSVNAccessFile /etc/svn/svn-nda.conf
SVNReposName "NDA repository."
SVNIndexXSLT "/svnindex.xsl"
</Location>
</VirtualHost>
答案3
您可能想要使用 Includes。虽然仍存在一些冗余,但可以让您的大部分配置都设置在一个文件中。
这实际上取决于您的目标以及您维护这些文件的频率。
看: http://httpd.apache.org/docs/current/mod/core.html#include
我使用过的一种技术是使用一个目录来保存所有位置。将此目录包含在主 apache 配置中。
Include /etc/httpd/conf/svn.d/*.conf
然后在 svn.d/*.conf 中为每个实例创建一个文件。例如,repoa.conf。
在 repoa.conf 中,我包含了另一个包含所有 repos 的标准节的文件。
要添加新的 repo,我只需将 repoa.conf 复制到 repob.conf,更新路径,然后重新启动。
虽然不漂亮,但是快速且简单。