How can query string parameters be forwarded through a proxy_pass with nginx?

前端 未结 7 1460
Happy的楠姐
Happy的楠姐 2020-11-27 10:26
upstream apache {
   server 127.0.0.1:8080;
}
server{
   location ~* ^/service/(.*)$ {
      proxy_pass http://apache/$1;
      proxy_redirect off;
   }
 }


        
相关标签:
7条回答
  • 2020-11-27 10:38

    I use a slightly modified version of kolbyjack's second approach with ~ instead of ~*.

    location ~ ^/service/ {
      proxy_pass http://apache/$uri$is_args$args;
    }
    
    0 讨论(0)
  • 2020-11-27 10:39

    I modified @kolbyjack code to make it work for

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

    with parameters

    location ~ ^/service/?(.*) {
        return 301 http://service_url/$1$is_args$args;
    }
    
    0 讨论(0)
  • 2020-11-27 10:40

    you have to use rewrite to pass params using proxy_pass here is example I did for angularjs app deployment to s3

    S3 Static Website Hosting Route All Paths to Index.html

    adopted to your needs would be something like

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

    if you want to end up in http://127.0.0.1:8080/query/params/

    if you want to end up in http://127.0.0.1:8080/service/query/params/ you'll need something like

    location /service/ {
        rewrite ^\/(.*) /$1 break;
        proxy_pass http://apache;
    }
    
    0 讨论(0)
  • 2020-11-27 10:42

    To redirect Without Query String add below lines in Server block under listen port line:

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

    With Query String:

    if ($uri ~ .*.containingString$) {
               return 301 https://$host/$uri/?$query_string;
    }
    
    0 讨论(0)
  • 2020-11-27 10:49

    From the proxy_pass documentation:

    A special case is using variables in the proxy_pass statement: The requested URL is not used and you are fully responsible to construct the target URL yourself.

    Since you're using $1 in the target, nginx relies on you to tell it exactly what to pass. You can fix this in two ways. First, stripping the beginning of the uri with a proxy_pass is trivial:

    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/;
    }
    

    Or if you want to use the regex location, just include the args:

    location ~* ^/service/(.*) {
      proxy_pass http://apache/$1$is_args$args;
    }
    
    0 讨论(0)
  • 2020-11-27 11:02

    github gist 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
    
    0 讨论(0)
提交回复
热议问题