svn协议本身不支持域名,仅http(s)模式可通过apache虚拟主机实现多域名指向同一仓库;svnserve(svn://)无法区分域名,仅依赖端口和路径。

SVN 协议本身不支持“域名”概念,它基于 svn:// 或 http:///https:// 协议访问,而 域名是 HTTP(S) 层的特性。因此,“多个不同域名指向同一个版本库”这一需求,只能在使用 Apache + mod_dav_svn(HTTP 模式)时实现;若使用原生 svnserve(svn:// 协议),则无法通过域名区分或路由——它只认端口和路径,不解析 Host 头。
下面分两种主流场景说明如何达成目标:
✅ 场景一:用 Apache + mod_dav_svn 提供 HTTP/HTTPS 访问(推荐,支持多域名)
这是唯一能真正实现“不同域名 → 同一仓库”的方式。原理是:多个虚拟主机(VirtualHost)共享同一个 <location></location> 配置,指向同一物理仓库路径。
关键配置步骤:
-
确保已安装并启用
mod_dav_svn和mod_alias# CentOS/RHEL yum install httpd mod_dav_svn systemctl start httpd
-
创建统一仓库(如
/var/svn/myrepo):svnadmin create /var/svn/myrepo
编辑 Apache 配置(例如
/etc/httpd/conf.d/subversion.conf),添加多个VirtualHost,共用同一仓库:
# 域名1:repo.example.com
<virtualhost>
ServerName repo.example.com
DocumentRoot "/var/www/html"
<location>
DAV svn
SVNPath /var/svn/myrepo
AuthType Basic
AuthName "My SVN Repository"
AuthUserFile /var/svn/passwd
Require valid-user
</location></virtualhost>
# 域名2:svn.internal.local
<virtualhost>
ServerName svn.internal.local
DocumentRoot "/var/www/html"
<location>
DAV svn
SVNPath /var/svn/myrepo # ← 完全相同路径!
AuthType Basic
AuthName "My SVN Repository"
AuthUserFile /var/svn/passwd
Require valid-user
</location></virtualhost>
⚠️ 注意:两个域名必须已正确解析到该服务器 IP,并且 Apache 能识别
ServerName(可通过curl -H "Host: repo.example.com" http://server-ip/测试)。
-
重启 Apache:
systemctl restart httpd
-
客户端即可用任一域名检出:
svn checkout http://repo.example.com/ svn checkout http://svn.internal.local/
✅ 效果:两个域名完全等价,读写同一仓库,权限、日志、钩子均共享。
❌ 场景二:仅用 svnserve(svn:// 协议)——无法实现域名路由
-
svnserve是轻量级守护进程,不处理 HTTP Host 头,也不绑定域名; - 它只监听一个端口(默认 3690),所有连接都按
-r指定的根目录进行路径解析; - 即使你在 DNS 中把
a.example.com和b.example.com都指向同一 IP,客户端执行svn://a.example.com/myrepo和svn://b.example.com/myrepo,实际都发往IP:3690,服务端无法区分来源域名,也无法做差异化路由。
? 所以:svn:// 协议下,“多域名指向同一库”是伪命题——它天然就是“单点服务”,域名只是 DNS 别名,无业务意义。
? 补充:如果想“逻辑隔离但物理共库”,可用路径权限控制(适用于 HTTP 或 svnserve)
即使只有一个仓库,也可通过 authz 实现不同用户/组访问不同子路径,例如:
[groups] team-a = alice, bob team-b = charlie, diana [/] * = r [/project-a] @team-a = rw @team-b = r [/project-b] @team-b = rw @team-a = r
这样 http://repo.example.com/project-a 和 http://svn.internal.local/project-b 可分别由不同团队使用,底层仍是同一仓库。
不复杂但容易忽略:域名生效依赖 DNS + Apache 虚拟主机匹配,而非 SVN 自身能力。











