3

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: OPTIONS リクエストが応答で無効な XML を返しました: 行 1 で XML 解析エラー: 要素が見つかりません ( http: //server.tld/trunk )

ただし、ルールを削除して /svn/trunk をクエリしても問題ありません。

ありがとう

4

1 に答える 1

3

まず、mod_rewriteはデフォルトで置換をURIではなくファイルパスとして扱うため、リクエストがmod_dav_svnに到達することはありません。URIではないため、Locationセクションが一致しません。PTフラグをオンにすると、置換をURIとして扱い、SVNに到達できるRewriteRuleようになります。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ます。

于 2013-03-02T07:22:30.553 に答える