[parameters] nginx를 사용하여 proxy_pass를 통해 쿼리 문자열 매개 변수를 어떻게 전달할 수 있습니까?

upstream apache {
   server 127.0.0.1:8080;
}
server{
   location ~* ^/service/(.*)$ {
      proxy_pass http://apache/$1;
      proxy_redirect off;
   }
 }

위의 스 니펫은 URL에 “service”문자열이 포함 된 요청을 다른 서버로 리디렉션하지만 쿼리 매개 변수는 포함하지 않습니다.



답변

로부터 proxy_pass의 문서 :

특별한 경우는 proxy_pass 문에서 변수를 사용하는 것입니다. 요청 된 URL은 사용되지 않으며 대상 URL을 직접 구성 할 책임은 전적으로 사용자에게 있습니다.

대상에서 $ 1을 사용하고 있기 때문에 nginx는 정확히 무엇을 전달해야하는지 알려주기 위해 사용자에게 의존합니다. 두 가지 방법으로이 문제를 해결할 수 있습니다. 첫째, proxy_pass로 uri의 시작 부분을 제거하는 것은 간단합니다.

location /service/ {
  # Note the trailing slash on the proxy_pass.
  # It tells nginx to replace /service/ with / when passing the request.
  proxy_pass http://apache/;
}

또는 정규식 위치를 사용하려면 인수 만 포함하면됩니다.

location ~* ^/service/(.*) {
  proxy_pass http://apache/$1$is_args$args;
}


답변

~대신 kolbyjack의 두 번째 접근 방식을 약간 수정 한 버전을 사용합니다 ~*.

location ~ ^/service/ {
  proxy_pass http://apache/$uri$is_args$args;
}


답변

@kolbyjack 코드를 수정하여 작동하도록했습니다.

http://website1/service
http://website1/service/

매개 변수 포함

location ~ ^/service/?(.*) {
    return 301 http://service_url/$1$is_args$args;
}


답변

rewrite를 사용하여 proxy_pass를 사용하여 params를 전달해야합니다. s3에 angularjs 앱 배포를 위해 한 예입니다.

S3 정적 웹 사이트 호스팅 모든 경로를 Index.html로 라우팅

당신의 필요에 채택 될 것입니다

location /service/ {
    rewrite ^\/service\/(.*) /$1 break;
    proxy_pass http://apache;
}

http://127.0.0.1:8080/query/params/ 에서 끝내려면

http://127.0.0.1:8080/service/query/params/ 에서 끝내려면
다음과 같은 것이 필요합니다.

location /service/ {
    rewrite ^\/(.*) /$1 break;
    proxy_pass http://apache;
}


답변

github 요점 https://gist.github.com/anjia0532/da4a17f848468de5a374c860b17607e7

#set $token "?"; # deprecated

set $token ""; # declar token is ""(empty str) for original request without args,because $is_args concat any var will be `?`

if ($is_args) { # if the request has args update token to "&"
    set $token "&";
}

location /test {
    set $args "${args}${token}k1=v1&k2=v2"; # update original append custom params with $token
    # if no args $is_args is empty str,else it's "?"
    # http is scheme
    # service is upstream server
    #proxy_pass http://service/$uri$is_args$args; # deprecated remove `/`
    proxy_pass http://service$uri$is_args$args; # proxy pass
}

#http://localhost/test?foo=bar ==> http://service/test?foo=bar&k1=v1&k2=v2

#http://localhost/test/ ==> http://service/test?k1=v1&k2=v2


답변

쿼리 문자열없이 리디렉션하려면 수신 포트 줄 아래의 서버 블록에 아래 줄을 추가합니다.

if ($uri ~ .*.containingString$) {
           return 301 https://$host/$uri/;
}

쿼리 문자열 사용 :

if ($uri ~ .*.containingString$) {
           return 301 https://$host/$uri/?$query_string;
}


답변

$ request_uri proxy_pass http : // apache / $ request_uri 추가 작업;