Я пытаюсь иметь 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
вариант)?