我正在尝试创建一个基于 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/