我是否应该无法进行这样的配置:使用 at 提供 SVN 存储库SVNParentPath
,<Location />
然后覆盖 DAV 并使用其他位置托管普通文件<Location /foo>
?我希望将 XSLT 文件托管在同一个子域上,并且仍在 root 处托管存储库。当然,如果我有一个名为 foo 的存储库,它将无法访问,这没关系。
<VirtualHost *:80>
...
#Host XSLT files here
<Location /foo>
DAV Off
</Location>
#Host my repos relative to root, such as /my_repo/
<Location />
DAV svn
SVNParentPath "myrepos"
SVNListParentPath on
SVNIndexXSLT "/foo/my.xsl"
...
</Location>
</VirtualHost>
但 DAV SVN 仍在寻找 repo:
<?xml version="1.0" encoding="utf-8"?>
<D:error xmlns:D="DAV:" xmlns:m="http://apache.org/dav/xmlns" xmlns:C="svn:">
<C:error/>
<m:human-readable errcode="720003">
Could not open the requested SVN filesystem
</m:human-readable>
</D:error>
编辑:我阅读了一些关于 mod rewrite 的内容,据我所知,重写规则的目标路径只能是本地的,除非使用重定向[R]
。例如,这有效,它创建了一个重定向(HTTP 302):
RewriteEngine On
RewriteRule ^/foo/(.*)$ http://someotherhost/foo/$1 [R]
但是,它仍然无法与 一起使用SVNIndexXSLT
。可能是因为它不遵循重定向。
答案1
“请注意,一旦您在某个位置启用了 DAV,它不能被子位置禁用。“(强调他们的)
你可以尝试使用 mod_rewriting 来解决这个问题。如果你有一个
RewriteRule ^/foo/(.*)$ /some/local/directory/$1 [L]
理论上可能避开 DAV,因为没有 PT 标志,它不应该将请求转交给任何其他模块。至少值得一试。
如果它不起作用,请务必回复此消息,以便其他尝试此操作的人会看到这是无法完成的;)
答案2
只需在 svn.example.com 上托管 svn,并保留 / 以实现正常 http。
答案3
您有没有找到答案?我碰巧现在正在尝试完全相同的配置,并且遇到了与您相同的问题。
不管怎样,这为您提供了一半的解决方案 - 前提是自动列出存储库(使用 SVNListParentPath On)的能力对您来说并不重要。
您可以改用 SVNPath 指令 - 因此您将得到类似以下内容:
<Location />
SVNIndexXSLT "/repos-web/view/repos.xsl"
# Other common options, such as Auth options can go here
</Location>
<Location /repository1>
SVNPath /var/lib/svn/repositories/repo1
DAV svn
</Location>
<Location /repository2>
SVNPath /var/lib/svn/repositories/repo2
DAV svn
</Location>
<Location /repository3>
SVNPath /var/lib/svn/repositories/repo3
DAV svn
</Location>
显然,如果您正在运行一个定期创建新存储库的设置(每个项目一个存储库的方法),那么这对您来说不太有吸引力。但对于数量固定的少量存储库来说,它还是可行的。
然后,如果您想要一些用户友好的内容,您可以在 Apache 文档根目录中放置一个硬编码的 index.htmhttp://svn.yourdomain.com/
我已经测试过这种方法,它确实有效。可惜的是,自动生成的存储库列表丢失了(并且必须在 httpd.conf 中映射每个存储库)