nginx location
블록 이 URL 쿼리 문자열과 일치 할 수 있습니까 ?
예를 들어 HTTP GET
요청 과 일치 할 수있는 위치 블록
GET /git/sample-repository/info/refs?service=git-receive-pack HTTP/1.1
답변
nginx 위치 블록이 URL 쿼리 문자열과 일치 할 수 있습니까?
짧은 답변 : 아니요.
긴 대답 : 소수의 위치 블록 만있는 경우 해결 방법이 있습니다.
다음은 특정 쿼리 문자열과 일치해야하는 3 개의 위치 블록에 대한 샘플 해결 방법입니다.
server {
#... common definitions such as server, root
location / {
error_page 418 = @queryone;
error_page 419 = @querytwo;
error_page 420 = @querythree;
if ( $query_string = "service=git-receive-pack" ) { return 418; }
if ( $args ~ "service=git-upload-pack" ) { return 419; }
if ( $arg_somerandomfield = "somerandomvaluetomatch" ) { return 420; }
# do the remaining stuff
# ex: try_files $uri =404;
}
location @queryone {
# do stuff when queryone matches
}
location @querytwo {
# do stuff when querytwo matches
}
location @querythree {
# do stuff when querythree matches
}
}
$ query_string, $ args 또는 $ arg_fieldname을 사용할 수 있습니다. 모두 일을 할 것입니다. 공식 문서에서 error_page에 대해 더 많이 알 수 있습니다 .
경고 : 표준 HTTP 코드 를 사용 하지 마십시오 .
답변
나는이 질문이 1 년이 지난 것을 알고 있지만, 지난 몇 일 동안 비슷한 문제로 뇌를 파괴하는 데 보냈다. 나는 밀고 당기는 것을 포함하여 공공 및 민간 저장소에 대한 다른 인증 및 처리 규칙을 원했습니다. 이것이 내가 마침내 생각 해낸 것이므로 공유하겠다고 생각했습니다. 나는 if
까다로운 지시어 라는 것을 알고 있지만 이것은 나에게 잘 작동하는 것 같습니다.
# 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;
# ...
}