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 denominado192.168.0.1
, supõe-se que você pretendia colocar umR
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.