git-upload-pack 및 git-receive-pack에 대한 nginx 별도의 정규식

git-upload-pack 및 git-receive-pack에 대한 nginx 별도의 정규식

나는 이것을 가지고있다

location ~ ^.*user/repo\.git\/(HEAD|info/refs|objects/info/.*|git-upload-pack)${

    //send to fastcgi_param SCRIPT_FILENAME /usr/bin/gitolite-shell;

}

이것은 클론에서 작동합니다. 키나 http 사용자/비밀번호 없이 공개 저장소를 만들 수 있도록 Gitolite를 수정했습니다.

이제 정보/참조를 푸시하려고 하면 이 경로와 일치하며 푸시를 담당하는 다음 위치로 이동할 수 없습니다.

location ~ ^.*user/repo\.git\/(HEAD|info/refs|objects/info/.*|git-receive-pack)${

   //some custom auth and so on

}

Btw, 이것은 공개 저장소에 대한 푸시를 위해 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-수신-팩)$. 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줄의 코드만 필요했기 때문에 짜증납니다. 나는 이 시간이 그만한 가치가 있기를 바랍니다.

관련 정보