# 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;
# ...
}
简短的回答:没有。
长答案:如果我们只有少数这样的位置块,则有一种解决方法。
以下是需要匹配特定查询字符串的 3 个位置块的示例解决方法:
您可以使用 $query_string、$args 或 $arg_fieldname。所有人都会做这项工作。您可能会在官方文档中了解更多关于 error_page 的信息。
警告:请务必不要使用标准 HTTP 代码。
我知道这个问题已经有一年多了,但在过去的几天里,我一直在为一个类似的问题摧毁我的大脑。我想要公共和私人回购的不同身份验证和处理规则,包括推送和拉取。这是我最终想出的,所以我想我会分享。我知道
if
这是一个棘手的指令,但这似乎对我有用:如果您使用 nginx 作为代理,还有另一种方法可以做到这一点。
在服务器块中设置一个变量:
在 location 块中,添加 if:
并添加两个新的代理指令:
它将始终转发到没有缓存的上游服务器