重写破坏svn

时间:2013-02-28 15:14:55

标签: svn mod-rewrite

我正在尝试创建一个基于HTTP_USER_AGENT的重写,出于各种原因我不能将svn放在root中但是需要将它放在/ 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:无法连接到网址“http://server.tld/trunk”的存储库   svn:E175002:OPTIONS请求返回了无效的XML   响应:第1行的XML解析错误:未找到任何元素   (http://server.tld/trunk

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

由于

1 个答案:

答案 0 :(得分:3)

首先,请求永远不会到达mod_dav_svn,因为默认情况下mod_rewrite将替换视为文件路径而不是URI。由于它不是URI,因此“位置”部分不匹配。您可以使用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