user1475269
user1475269

Reputation:

Nginx proxy_pass : Is it possible to add a static parameter to the URL?

I'd like to add a parameter in the URL in a proxy pass. For example, I want to add an apiKey : &apiKey=tiger
http://mywebsite.com/oneapi?field=22 ---> https://api.somewhere.com/?field=22&apiKey=tiger Do you know a solution ?

Thank's a lot, Gilles.

server {
      listen   80;
      server_name  mywebsite.com;
      location /oneapi{
      proxy_pass         https://api.somewhere.com/;
      }
    }

Upvotes: 26

Views: 53968

Answers (5)

warch
warch

Reputation: 2599

The other answers do not work if $args is empty.

This also works if $args is empty.

location /oneapi {
  set $delimeter "";

  if ($is_args) {
    set $delimeter "&";
  }

  set $args "$args${delimeter}apiKey=tiger";

  proxy_pass https://api.somewhere.com/;
}

Upvotes: 17

RammusXu
RammusXu

Reputation: 1260

For someone get here. Thanks for https://serverfault.com/questions/912090/how-to-add-parameter-to-nginx-query-string-during-redirect

The cleanest way on 2021 is:

rewrite ^ https://api.somewhere.com$uri?apiKey=tiger permanent;

If a replacement string includes the new request arguments, the previous request arguments are appended after them

proxy_pass way


upstream api {
    server api.somewhere.com;
}

location /oneapi {
    rewrite ^/oneapi/?(.*) /$1?apiKey=tiger break;
    proxy_pass https://api$uri$is_args$args;
}

Upvotes: 1

AnJia
AnJia

Reputation: 149

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

Upvotes: 4

Mahn
Mahn

Reputation: 16605

Here's a way to add a paramater in nginx when it's unknown whether the original URL had arguments or not (i.e. when you have to account for both ? and &):

location /oneapi {
    set $pretoken "";
    set $posttoken "?";

    if ($is_args) {
        set $pretoken "?";
        set $posttoken "&";
    }

    # Replace apiKey=tiger with your variable here
    set $args "${pretoken}${args}${posttoken}apiKey=tiger"; 

    # Optional: replace proxy_pass with return 302 for redirects
    proxy_pass https://api.somewhere.com$uri$args; 
}

Upvotes: 3

Jack
Jack

Reputation: 1912

location = /oneapi {
  set $args $args&apiKey=tiger;
  proxy_pass https://api.somewhere.com;
}

Upvotes: 35

Related Questions