Sei que essa pergunta tem mais de um ano, mas passei os últimos dias destruindo meu cérebro por causa de um problema semelhante. Eu queria diferentes regras de autenticação e manipulação para repositórios públicos e privados, incluindo push e pull. Isso é o que eu finalmente descobri, então decidi compartilhar. Eu sei que ifé uma diretiva complicada, mas isso parece funcionar muito bem para mim:
# pattern for all repos, public or private, followed by username and reponame
location ~ ^(?:\/(private))?\/([A-Za-z0-9]+)\/([A-Za-z0-9]+)\.git(\/.*)?$ {
# if this is a pull request
if ( $arg_service = "git-upload-pack" ) {
# rewrite url with a prefix
rewrite ^ /upload$uri;
}
# if this is a push request
if ( $arg_service = "git-receive-pack" ) {
# rewrite url with a prefix
rewrite ^ /receive$uri;
}
}
# for pulling public repos
location ~ ^\/upload(\/([A-Za-z0-9]+)\/([A-Za-z0-9]+)\.git(\/.*)?)$ {
# auth_basic "git";
# ^ if you want
# ...
# fastcgi_pass unix:/var/run/fcgiwrap.socket;
# ...
}
# for pushing public repos
location ~ ^\/receive(\/([A-Za-z0-9]+)\/([A-Za-z0-9]+)\.git(\/.*)?)$ {
# auth_basic "git";
# ^ if you want
# ...
# fastcgi_pass unix:/var/run/fcgiwrap.socket;
# ...
}
# for pulling private repos
location ~ ^\/upload\/private(\/([A-Za-z0-9]+)\/([A-Za-z0-9]+)\.git(\/.*)?)$ {
# auth_basic "git";
# ^ if you want
# ...
# fastcgi_pass unix:/var/run/fcgiwrap.socket;
# ...
}
# for pushing private repos
location ~ ^\/receive\/private(\/([A-Za-z0-9]+)\/([A-Za-z0-9]+)\.git(\/.*)?)$ {
# auth_basic "git";
# ^ if you want
# ...
# fastcgi_pass unix:/var/run/fcgiwrap.socket;
# ...
}
Resposta curta : Não.
Resposta longa : Existe uma solução alternativa se tivermos apenas alguns desses blocos de localização.
Aqui está um exemplo de solução alternativa para 3 blocos de localização que precisam corresponder a strings de consulta específicas:
Você pode usar $query_string, $args ou $arg_fieldname. Todos farão o trabalho. Você pode saber mais sobre error_page nos documentos oficiais .
Aviso: Certifique -se de não usar os códigos HTTP padrão .
Sei que essa pergunta tem mais de um ano, mas passei os últimos dias destruindo meu cérebro por causa de um problema semelhante. Eu queria diferentes regras de autenticação e manipulação para repositórios públicos e privados, incluindo push e pull. Isso é o que eu finalmente descobri, então decidi compartilhar. Eu sei que
if
é uma diretiva complicada, mas isso parece funcionar muito bem para mim:Existe outra maneira de fazer isso, se você estiver usando o nginx como proxy.
defina uma variável no bloco do servidor:
Dentro do bloco de localização, adicione o if:
E adicione duas novas diretivas de proxy:
ele sempre encaminhará para o servidor upstream sem cache