2013-02-28 68 views
3

我試圖創建是基於HTTP_USER_AGENT的重寫,由於種種原因,我不能把svn的根,但需要有它/ 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:位於第1行XML解析錯誤:OPTIONS請求返回無效的XML在 響應沒有元件發現 (http://server.tld/trunk

刪除規則和查詢/ svn/trunk工作正常。

感謝

+0

您可以執行的測試是在常規瀏覽器中加載該URL(註釋掉用戶代理檢查來執行此操作)。 – 2013-02-28 15:17:52

回答

3

首先請求永遠不會獲得通過默認的mod_rewrite因爲mod_dav_svn的對待替代的文件路徑,而不是一個URI。由於它不是URI,位置部分不匹配。您可以使用PTRewriteRule爲了治療替換爲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

+0

+1。今天我遇到了同樣的問題,使用Apache 2.2.27顛覆1.8.11。即使使用[PT]標誌,svn客戶端也會聲明「http://.../XXX與http://.../YYY不在同一個存儲庫中」 – 2015-03-31 09:16:48