apache 本身不托管 svn 仓库,但可通过加载 mod_dav_svn 和 mod_authz_svn 模块,结合 svnpath(单库)或 svnparentpath(多库)配置,实现 http 协议访问多个独立 svn 库;需确保模块启用、路径权限正确、authuserfile 和 authzsvnaccessfile 合理设置,并以 apache 用户身份拥有仓库目录。

Apache 本身不托管 SVN 仓库,但可通过加载 mod_dav_svn 模块,配合正确配置,让 HTTP 协议访问多个独立 SVN 库。关键在于:Apache 作为前端代理,把不同 URL 路径(或端口)映射到不同仓库路径,并由模块统一处理 SVN 协议逻辑。
确认 SVN 模块已启用并可用
Apache 必须加载两个核心模块才能支持 SVN 的 HTTP 访问:
-
mod_dav_svn.so—— 提供 SVN WebDAV 接口实现 -
mod_authz_svn.so—— 支持基于路径的细粒度权限控制
检查方法:在 Apache 配置目录(如 /etc/httpd/modules/ 或 XAMPP\apache\modules\)中确认这两个文件存在;再打开 httpd.conf,确保有类似以下启用行(取消注释):
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
LoadModule authz_svn_module modules/mod_authz_svn.so
配置多个端口分别服务不同 SVN 库
每个端口对应一个独立的 <location></location> 区块,指向唯一仓库路径,避免冲突:
- 编辑
httpd.conf,添加监听端口(例如):
Listen 8081
Listen 8082 - 在
httpd.conf或conf/extra/httpd-vhosts.conf中为每个端口定义虚拟服务区块:
DocumentRoot "/var/www/empty"
DAV svn
SVNPath /var/svn/project-a
AuthType Basic
AuthName "Project A"
AuthUserFile /var/svn/passwd
AuthzSVNAccessFile /var/svn/project-a/conf/authz
Require valid-user
- 同理,为
:8082配置另一个<virtualhost></virtualhost>,指向/var/svn/project-b,使用独立的authz文件
统一管理多库时用 SVNParentPath + Location 路径区分
若希望所有库共用一个端口(如 80 或 8080),通过 URL 路径区分(/svn/project-a、/svn/project-b),推荐使用 SVNParentPath:
- 所有仓库放在同一父目录下,例如:
/var/svn/repos/,内含project-a/、project-b/ - 配置示例(监听默认 80 端口即可):
DAV svn
SVNParentPath /var/svn/repos
SVNListParentPath on
AuthType Basic
AuthName "SVN Repositories"
AuthUserFile /var/svn/passwd
AuthzSVNAccessFile /var/svn/authz
Require valid-user -
authz文件需按库+路径写明权限,例如:
[project-a:/]
user1 = rw
[project-b:/trunk]
user2 = r
权限与安全要点
忽略权限设置会导致拒绝访问或越权操作:
- 仓库目录及子目录必须属主为 Apache 运行用户(如
apache或www-data),命令示例:
chown -R apache:apache /var/svn/project-a - 密码文件(
AuthUserFile)建议用htpasswd -c创建,后续用户用htpasswd追加 - 禁止将
SVNPath或SVNParentPath写在未启用 DAV 的上下文中,否则报错Invalid command 'SVNPath' - 生产环境建议启用 HTTPS,并在
<location></location>中补充SSLRequireSSL










