nginx git-upload-pack と git-receive-pack の別々の正規表現

nginx git-upload-pack と git-receive-pack の別々の正規表現

私はこれを持っています

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

}

ちなみに、これはパブリック リポジトリへのプッシュ用に 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)$

最初が常に 2 番目をキャッチするため、問題になります。

私はいくつかやってみました

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)$。場所がuser/repo.git/info/refsであるため、Nginxの最初のケースが一致しないため、これは機能しません。

答え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 は、Apache のパブリック リポジトリでの pull/push を解決するのに 5 行のコードしか必要なかったので、ひどいです。費やした時間が価値あるものであることを願います。

関連情報