svn - 重写中断 svn

标签 svn mod-rewrite

我正在尝试创建一个基于 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: Unable to connect to a repository at URL 'http://server.tld/trunk' svn: E175002: The OPTIONS request returned invalid XML in the response: XML parse error at line 1: no element found (http://server.tld/trunk)

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

谢谢

最佳答案

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

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

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

最终,重写或重定向 URI 将不适用于 Subversion。该协议(protocol)对此并不友好。我建议只使用 /svn/trunk

关于svn - 重写中断 svn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15139054/

相关文章:

php - 在从 SVN 部署期间维护开发环境和实时环境之间的配置差异

python - Django:从Apache mod_rewrite重定向时,错误的请求语法

带有 LDAP 的 svnserve

svn - 如何更新使用 svn-copy 制作的 SVN 分支?

linux - TortoiseSVN,如何撤消上次操作?

regex - 使用 htaccess 删除/index.php 链接?

apache - 结合 htaccess 中的重写条件进行重定向

apache - SSL 证书无 WWW Apache (ModRewrite) EV

.htaccess - 如何阻止 IE 中这种奇怪的自动重新加载

ubuntu - 如何在 ubuntu 服务器上的 svn 中将端口号添加到工作副本 url