nginx 위치 블록이 URL 쿼리 문자열과 일치 할 수 있습니까?


23

nginx location블록 이 URL 쿼리 문자열과 일치 할 수 있습니까 ?

예를 들어 HTTP GET요청 과 일치 할 수있는 위치 블록

GET /git/sample-repository/info/refs?service=git-receive-pack HTTP/1.1

nginx가 문자열 비교를 수행하는 것처럼 "location / git / sample-repository / info / refs? service = git-receive-pack"이라고 생각합니다.
JosefScript

전체 URL 또는 물음표 앞 부분의 문자열 비교 ( ?)?
Derek Mahar



1
나 자신이 문제를 통해 발견으로 일부 마지막 설명은 : nginx.org/en/docs/http/request_processing.html 명확하게 진술한다 : "주를 모든 유형의 위치를 인수없이 요청 줄 만 URI 부분을 테스트하는 것이이이 인수하기 때문에 이루어집니다. 쿼리 문자열에서 여러 가지 방법으로 제공 될 수 있습니다 "
Thomas Urban

답변:


37

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
재미있는 접근법! $args ~ "service=git-send-pack"대신에 추천 할 수 $args = "service=git-send-pack"있습니까? 이 양식은 여러 쿼리 매개 변수를 수용합니다.
Derek Mahar

1
stackoverflow.com/a/40313590/107158 은 쿼리 문자열 인수를 처리하기 위해 수행 한 접근 방식을 보여줍니다. 귀하의 답변과 마찬가지로 광산은 if및을 $arg_fieldname사용하지만 및 rewrite대신을 사용 합니다 . 이 예 에서 교체 매개 변수 를 사용하려는 시도 가 실패했습니다. error_pagelocation @name@namerewrite
Derek Mahar

1
그건 그렇고, $args ~그리고 있어야합니다 $arg_somerandomfield =.
Derek Mahar

1
map이 목적을 위해 nginx 기능을 사용할 수도 있습니다 .
Tero Kilkanen

1
@PothiKalimuthu, 이것을 명확히 해 주셔서 감사합니다. 그동안 내가 한 일은 query매개 변수를 url 경로 feedback/{auth_key}대신 다음 과 같이 URL 경로 로 바꾸는 것입니다 /feedback?auth_key=abc. 이 방법으로 사용할 필요가 없습니다.를 사용 if하여 위치 패턴을 정의 할 수 있습니다 regex.
WM

4

나는이 질문이 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;
    # ...

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.