我正在尝试创建一个基于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工作正常。
由于
答案 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
。