Como posso configurar o Apache para redirecionar um subdiretório para um repositório de subversão?

4

Eu tenho um antigo repositório subversion que foi configurado como o único repositório em uma máquina. Acessamos os URLs assim:

http://myserver.com/svn/trunk/...
http://myserver.com/svn/branches/...

Estamos mudando para um novo servidor no qual temos vários repositórios configurados sob uma instalação do dav-svn sob o apache2, então, por padrão, nós os acessamos assim:

http://myserver.com/svn/repo/trunk/
http://myserver.com/svn/repo/branches/
  or
http://192.168.0.1/svn/repo/trunk/
http://192.168.0.1/svn/repo/branches/

Eu preciso mover o repositório antigo para a nova máquina sem alterar as URLs. Por isso, quero configurar um repo e fazer com que o apache o redirecione, dependendo da URL, então:

http://myserver.com/svn/trunk

redireciona para

http://myserver.com/svn/repo/trunk

de forma transparente. Eu posso fazer isso para redirecionar para a URL baseada em IP, mas quando eu tento fazer com que ela redirecione usando o próprio nome de domínio, isso me dá mensagens proibidas ou "Não foi possível abrir o sistema de arquivos SVN solicitado":

<VirtualHost *:80>
  ServerName myserver.com
  ServerAlias www.myserver.com
  DocumentRoot /var/www/vhosts/myserver.com/html
  CustomLog /var/www/vhosts/myserver.com/logs/access_log combined
  ErrorLog /var/www/vhosts/myserver.com/logs/error_log

  RewriteEngine On
  RewriteRule ^/svn(.*)$ /svn/myrepo$1 [L,QSA]

  # THE FOLLOWING WORKS, BUT IS NOT TRANSPARENT
  # RewriteRule ^/svn(.*)$ http://192.168.0.1/svn/myrepo$1 [L,QSA] 

  <Directory /var/www/vhosts/myserver.com/html>
     AllowOverride All
  </Directory>
</VirtualHost>

E o arquivo subversion.conf:

<Location /svn>
  DAV svn
  SVNParentPath /var/svn/repository

  AuthType Basic
  AuthName "Subversion Repository"
  AuthUserFile /var/svn/repository/.htpasswd
  Require valid-user
</Location>

Idéias sobre como resolver o problema?

    
por Mark S. 30.10.2009 / 17:41

2 respostas

3

Resposta curta: use o sinalizador PT em sua Regra de regravação.

Primeiro, uma pequena história de fundo do Apache. Quando o Apache recebe uma solicitação, ele passa por um processo de mapeamento dessa solicitação para o armazenamento local. Depois disso, o Apache tem dois dados sobre o que você solicitou. O URL da solicitação e o caminho do arquivo. Portanto, uma solicitação para /svn/blah é convertida em /var/www/vhosts/myserver.com/html/svn/blah e esse caminho é armazenado separadamente. O mod_rewrite permite que você ajuste esse comportamento para rotear urls onde quiser.

Agora, os dois RewriteRules que você tem lá estão implicitamente fazendo coisas diferentes.

  • O primeiro que você tem lá é uma reescrita. É preciso um URL como /svn/blah e, em vez de usar o comportamento acima, ele mapeia como se você realmente solicitasse /svn/myrepo/blah , então o caminho de arquivo resultante seria /var/www/vhosts/myserver.com/html/svn/myrepo/blah . No entanto, e aqui está o ponto crítico, ele não modifica o URL solicitado . O URL de solicitação ainda é /svn/blah , o apache agora acha que o arquivo está em .../svn/myrepo/blah em vez de .../svn/blah .

    Por que isso importa, você pergunta? Porque o módulo de subversão não usa o caminho de arquivo. Olha para o URL da solicitação. Então, apache e mod_rewrite apenas perderam tempo fazendo tudo isso, porque mod_dav_svn apenas o ignora. O que você precisa é de mod_rewrite para alterar o URL da solicitação. E é isso que o PT faz. Ele modifica o url da requisição e o caminho do arquivo, então, mais tarde, quando chegar ao mod_dav_svn, ele verá o URL alterado.

  • O segundo é um redirecionamento. Como a substituição começa com http:// e o apache não tem um host virtual denominado 192.168.0.1 , supõe-se que você pretendia colocar um R em seus sinalizadores, pois não pode traduzir isso em um caminho de arquivo. Isso está enviando de volta uma mensagem "Hey, está aqui" para o cliente de subversão, e está fazendo outra solicitação para ele.

Agora, tendo dito tudo isso, você nunca terá mais de um repositório lá com essa configuração, a menos que você faça algo para forçar o mod_rewrite a pular as urls dos outros repositórios. mod_rewrite irá alegremente mudar /svn/bignewproject/blah para /svn/myrepo/bignewproject/blah para você o tempo todo. Você poderia adicionar uma regra antes de o RewriteRule ter você como:

RewriteRule ^/svn/(myrepo|myotherrepo|coolproject|stuff|etc)/ - [S=1]

Isso fará com que pule a próxima regra. No entanto, você vai atualizá-lo manualmente a partir de agora. Você pode conseguir algo automatizado com alguma magia de RewriteCond, mas provavelmente será complicado. Eu não estou muito familiarizado com isso, então alguém teria que te ajudar lá fora.

Se isso for usado apenas por um pequeno grupo de pessoas, talvez seja melhor deixar de lado esse material de reescrita e apenas atualizar as cópias de trabalho de todos. svn switch --relocate destina-se especificamente a situações em que os repositórios são movidos e você deseja apenas atualizar sua cópia de trabalho sem fazer o check-out novamente. Eu entendo que existem situações em que isso simplesmente não é viável.

    
por 31.10.2009 / 02:45
0

O Subversion usa mais do que apenas comandos GET e POST simples, infelizmente, então eu acho que talvez a melhor maneira de redirecionar é usar o mod_proxy do Apache para inverter os pedidos do proxy. Não tenho certeza se há uma maneira melhor

Proxy reverso do Apache / Subversion descrito nesta página link

    
por 30.10.2009 / 17:58