Подтвердить что ты не робот

С nginx, как перенаправить параметры запроса?

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

Выше фрагмент будет перенаправлять часть запросов внутри этого URL-адреса, включая строку "service" на другой сервер, но не включает параметры запроса.

4b9b3361

Ответ 1

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

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

Поскольку вы используете $1 в цели, nginx полагается на вас, чтобы точно сказать, что передать. Вы можете исправить это двумя способами. Во-первых, зачистка начала 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/;
}

Или, если вы хотите использовать расположение регулярных выражений, просто включите args:

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

Ответ 2

Я использую слегка измененную версию второго подхода kolbyjack с ~ вместо ~*.

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

Ответ 3

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

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

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

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

Ответ 4

вам нужно использовать rewrite для передачи параметров с помощью 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;
}

Ответ 5

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 "?"
    # 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

Ответ 6

Для перенаправления Без строки запроса добавьте ниже строки в блок сервера в строке порта прослушивания

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

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

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