у меня есть это
location ~ ^.*user/repo\.git\/(HEAD|info/refs|objects/info/.*|git-upload-pack)${
//send to fastcgi_param SCRIPT_FILENAME /usr/bin/gitolite-shell;
}
Это работает для клона. Я модифицировал Gitolite, чтобы я мог создавать публичные репозитории без ключа или http-пользователя/пароля.
Теперь, когда я хочу отправить информацию/ссылки, они сопоставляются с этим маршрутом, и я не могу перейти к следующему местоположению, которое отвечает за отправку.
location ~ ^.*user/repo\.git\/(HEAD|info/refs|objects/info/.*|git-receive-pack)${
//some custom auth and so on
}
Кстати, это работает в Apache для отправки в публичные репозитории:
<LocationMatch "^/username/repo/git-receive-pack$">
</LocationMatch>
Суть в том, что:
^.*user/repo\.git\/(HEAD|info/refs|objects/info/.*|git-upload-pack)$
^.*user/repo\.git\/(HEAD|info/refs|objects/info/.*|git-receive-pack)$
являются проблемой, так как первый всегда поймает второго.
Я пытался сделать что-то
if ($args = "service=git-receive-pack"){
//do redirect to user/repo.git/git-receive-pack but that will not work since
//info/refs?service=git-receive-pack must be called first.
}
Мне нужна помощь с регулярным выражением и не забывайте, что вы не можете сопоставить строку запроса местоположения с местоположением Nginx. Например
user/repo.git/info/refs?service=git-receive-pack
user/repo.git/git-receive-pack
можно сопоставить с простым `^.пользователь/repo.git/.(git-receive-pack)$. Это не сработает, так как первый случай в Nginx не совпадает, потому что местоположение — user/repo.git/info/refs.
решение1
Я решил эту проблему через 24 часа :(
Это решение, которое работает у меня.
location = /username/repo.git/info/refs {
if ($args ~ service=git-upload-pack) {
rewrite ^ /username/repo.git/git-upload-pack;
}
if ($args ~ service=git-receive-pack){
rewrite ^ /username/repo.git/git-receive-pack;
}
}
location ~ /username/repo.git/git-upload-pack {
gzip off;
if ( $request_method ~ POST ){
set $uri1 $uri;
}
if ( $request_method ~ GET ){
set $uri1 /username/repo.git/info/refs;
}
fastcgi_param PATH_INFO $uri1;
fastcgi_param REMOTE_USER daemon;
fastcgi_param GIT_PROJECT_ROOT /var/lib/gitolite/repositories;
fastcgi_param GITOLITE_HTTP_HOME /var/lib/gitolite;
fastcgi_param SCRIPT_FILENAME /usr/bin/gitolite-shell;
fastcgi_param QUERY_STRING $query_string;
fastcgi_pass 127.0.0.1:1234;
include fastcgi_params;
}
location = /username/repo.git/git-receive-pack{
gzip off;
if ( $request_method ~ POST ){
set $uri1 $uri;
}
if ( $request_method ~ GET ){
set $uri1 /username/repo.git/info/refs;
}
satisfy any;
auth_basic "Restricted Access for repository_path";
auth_basic_user_file "/usr/local/nginx/htpasswd";
auth_request /auth;
fastcgi_param PATH_INFO $uri1;
fastcgi_param REMOTE_USER $remote_user;
fastcgi_param GIT_PROJECT_ROOT /var/lib/gitolite/repositories;
fastcgi_param GITOLITE_HTTP_HOME /var/lib/gitolite;
fastcgi_param SCRIPT_FILENAME /usr/bin/gitolite-shell;
fastcgi_param QUERY_STRING $query_string;
fastcgi_pass 127.0.0.1:1234;
include fastcgi_params;
}
Этот nginx отстой, так как мне понадобилось всего 5 строк кода для решения pull/push на публичных репозиториях в apache. Надеюсь, что эти потраченные часы того стоят.