Apache DAV 在 `/` 处,普通托管在 `/foo` 处 - 如何实现?

Apache DAV 在 `/` 处,普通托管在 `/foo` 处 - 如何实现?

我是否应该无法进行这样的配置:使用 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 中映射每个存储库)

相关内容