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

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;
    # ...

}