3

我正在尝试创建一个基于 HTTP_USER_AGENT 的重写,由于各种原因,我不能将 svn 放在根目录中,但需要将它放在 /svn 上

现在的规则如下:

RewriteCond %{HTTP_USER_AGENT} ^SVN
RewriteRule ^(.*)$ /svn/$1 [L]

位置定义是:

  <Location /svn>
    DAV svn
    SvnPath /home/subgit/repos/testrepo
    AuthType Basic
    AuthName "subgit"
    AuthBasicProvider file
    AuthUserFile /home/subgit/etc/subgit
    AuthzSVNAccessFile /home/subgit/etc/subgit.access
    <LimitExcept GET PROPFIND OPTIONS REPORT>
      Require valid-user
    </LimitExcept>
  </Location>

但是尝试使用 SVN 客户端访问它,我得到以下结果:

svn:E175002:无法连接到位于 URL ' http://server.tld/trunk ' 的存储库 svn:E175002:OPTIONS 请求在响应中返回了无效的 XML:第 1 行的 XML 解析错误:未找到元素(http: //server.tld/trunk )

删除规则并查询 /svn/trunk 工作正常。

谢谢

4

1 回答 1

3

首先,请求永远不会到达 mod_dav_svn,因为默认情况下 mod_rewrite 将替换视为文件路径而不是 URI。由于它不是 URI,因此 Location 部分不匹配。您可以使用PT标志RewriteRule来将替换视为 URI,从而允许它访问 SVN: http ://httpd.apache.org/docs/current/rewrite/flags.html#flag_pt

但是,即使您添加了PT标志,您也会遇到另一个问题。特别是关于 URL 不是同一个存储库的错误。这是因为服务器向客户端提供了 URI,而客户端已经意识到 SVN 提供的 URI 不是它发现的存储库根 URL 的子级。

您尝试基于 UserAgent 检测 SVN 服务器并不能真正保证工作。大多数 SVN 客户端都在使用 subversion 项目库,但是有几个独立的实现可能会或可能不会遵循该模式。

最终,重写或重定向 URI 对 Subversion 不起作用。该协议对此并不友好。我建议只使用/svn/trunk.

于 2013-03-02T07:22:30.553 回答