Git Smart HTTP (S) com um redirecionamento de URL, não funcionando

1

Estou tentando ter o GitList (visualizador da Web do PHP para git) e o GIT Smart HTTP (S) no mesmo domínio git.domain. ext. A seguir está a configuração real:

  • URLs HTTP inteligentes do GIT são o formulário git.domain.ext / git / reponame.git
  • GitList é veiculado por meio de git.domain.ext / gitlist

Até agora, tudo bem. Tudo funciona.

O que eu gostaria de alcançar é o seguinte:

  • Qualquer solicitação do formulário git.domain.ext / *. git deve ir para git.domain.ext / git / *. git
  • Qualquer outra solicitação deve ser padronizada para git.domain.ext / gitlist

O seguinte é a minha configuração do Apache:

 <VirtualHost *:443>
    ServerName git.domain.ext
    DocumentRoot /home/user/www/git.domain.ext

    SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
    SetEnv GIT_PROJECT_ROOT /home/user/git/
    SetEnv GIT_HTTP_EXPORT_ALL

    ScriptAlias /git/ /usr/lib/git-core/git-http-backend/

    <Location />
            AuthName "Git Authentication"
            AuthType Basic
            Require valid-user
            AuthUserFile /home/user/git/.htpasswd
    </Location>
    <LocationMatch "^/git/.*/git-receive-pack$">
            AuthType Basic
            AuthName "Git Access"
            Require valid-user
            AuthUserFile /home/user/git/.htpasswd
    </LocationMatch>
    [..]
 </VirtualHost>

O seguinte é o .htaccess em /home/user/www/git.domain.ext

AuthName "Git Authentication"
AuthType Basic
Require valid-user
AuthUserFile /home/user/git/.htpasswd


<IfModule mod_rewrite.c>
    Options -MultiViews

    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^(.*)\.git
    RewriteRule ^(.*)\.git /git/$1.git [R=301,L]

    RewriteRule ^(.*) /gitlist/ [R=301,L]
</IfModule>

Git operações com o trabalho original /git/*.git:

git clone https://[email protected]/git/test.git
Cloning into 'test'...
Password for 'https://[email protected]':
remote: Counting objects: 343, done.
remote: Compressing objects: 100% (322/322), done.
remote: Total 343 (delta 110), reused 149 (delta 12)
Receiving objects: 100% (343/343), 1.13 MiB | 1.36 MiB/s, done.
Resolving deltas: 100% (110/110), done.

Infelizmente, as operações do git com o /* / git desejado não funcionam:

git clone https://git.domain.ext/test.git
Cloning into 'test'...
Password for 'https://[email protected]':
fatal: https://[email protected]/test.git/info/refs?service=git-upload-pack not found: did you run git update-server-info on the server?

No entanto, parece que o redirecionamento funciona:

curl --user user:pass https://git.domain.ext/test.git

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://git.domain.ext/git/test.git">here</a>.</p>
[..]

Obrigado pela sua ajuda.

    
por dgraziotin 04.02.2013 / 09:36

2 respostas

1

Como se viu, é sempre um erro de mod_rewrite: -)

Para fazer o trabalho, usei o seguinte no meu .htaccess:

<IfModule mod_rewrite.c>
    Options -MultiViews
    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^(.*)\.git
    RewriteRule ^(.*)\.git /git/%{REQUEST_URI} [L]
    RewriteRule (.*) /gitlist/ [R,L]
</IfModule>

O problema estava no RewriteRule ^(.*)\.git /git/$1.git [R=301,L] anterior, que gerava erros 404. Estranhamente, eu poderia identificá-los usando apenas --verbose com curl.

    
por 04.02.2013 / 11:38
0

Pelo que entendi, o git como cliente não suporta redirecionamentos. Existe alguma razão pela qual você deseja que a reescrita ocorra como um redirecionamento em vez de uma reescrita silenciosa (ou seja, sem a opção R=302 )?

    
por 04.02.2013 / 10:11