Назад | Перейти на главную страницу

Git Smart HTTP (S) с перенаправлением URL-адреса, не работает

Я пытаюсь иметь GitList (Веб-средство просмотра PHP для git) и GIT Smart HTTP (S) в одном домене git.domain.ext. Ниже приведены фактические настройки:

Все идет нормально. Все работает.

Я хотел бы добиться следующего:

Вот моя конфигурация 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>

Ниже приведен .htaccess в /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 с исходным /git/*.git работают:

git clone https://user@git.domain.ext/git/test.git
Cloning into 'test'...
Password for 'https://user@git.domain.ext':
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.

К сожалению, операции git с нужным /*.git не работают:

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

Однако похоже, что перенаправление работает:

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>
[..]

Спасибо за вашу помощь.

Как оказалось, это всегда ошибка mod_rewrite :-)

Для работы я использовал в своем .htaccess следующее:

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

Проблема была в предыдущем RewriteRule ^(.*)\.git /git/$1.git [R=301,L], который выдавал 404 ошибки. Как ни странно, я мог обнаружить их только с помощью --verbose с curl.

Насколько я понимаю, git как клиент не обрабатывает перенаправления. Есть ли причина, по которой вы хотите, чтобы эта перезапись происходила как перенаправление, а не как тихая перезапись (т.е. без R=302 вариант)?