Как можно передать параметры строки запроса через proxy_pass с nginx? - PullRequest
93 голосов
/ 15 ноября 2011
upstream apache {
   server 127.0.0.1:8080;
}
server{
   location ~* ^/service/(.*)$ {
      proxy_pass http://apache/$1;
      proxy_redirect off;
   }
 }

Приведенный выше фрагмент перенаправит запросы, в которых URL-адрес содержит строку «service», на другой сервер, но не содержит параметров запроса.

Ответы [ 6 ]

128 голосов
/ 15 ноября 2011

Из документации proxy_pass :

Особый случай - использование переменных в операторе proxy_pass: запрошенный URL-адрес не используется, и вы несете полную ответственность за создание целевого URL-адресасебя.

Поскольку вы используете $ 1 в качестве цели, nginx полагается на вас, чтобы точно сказать, что передать.Вы можете исправить это двумя способами.Во-первых, удаление начала URI с помощью proxy_pass тривиально:

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;
}
22 голосов
/ 25 июля 2013

Я использую слегка модифицированную версию второго подхода Колби Джека с ~ вместо ~*.

location ~ ^/service/ {
  proxy_pass http://apache/$uri$is_args$args;
}
7 голосов
/ 25 сентября 2015

Я изменил код @kolbyjack, чтобы он работал для

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

с параметрами

location ~ ^/service/?(.*) {
    return 301 http://service_url/$1$is_args$args;
}
4 голосов
/ 24 мая 2016

вы должны использовать перезапись для передачи параметров с использованием proxy_pass. Вот пример, который я сделал для развертывания приложения angularjs на s3

Статический хостинг 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;
}
1 голос
/ 16 октября 2017

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 голосов
/ 06 июня 2017

Чтобы перенаправить без строки запроса, добавьте следующие строки в блоке сервера под строкой порта прослушивания:

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

С строкой запроса:

if ($uri ~ .*.containingString$) {
           return 301 https://$host/$uri/?$query_string;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...