it-swarm.com.de

Wie können Abfrage-String-Parameter über einen Proxy-Pass mit Nginx weitergeleitet werden?

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

Das obige Snippet leitet Anforderungen um, bei denen die URL die Zeichenfolge "Service" enthält, an einen anderen Server, aber keine Abfrageparameter.

86
Alex Luya

Aus der proxy_pass Dokumentation:

Ein Sonderfall ist die Verwendung von Variablen in der Anweisung proxy_pass: Die angeforderte URL wird nicht verwendet und Sie sind selbst dafür verantwortlich, die Ziel-URL selbst zu erstellen.

Da Sie $ 1 für das Ziel verwenden, ist nginx darauf angewiesen, dass Sie genau sagen, was passieren soll. Sie können dies auf zwei Arten beheben. Zunächst ist es unbedeutend, den Anfang des URI mit einem Proxy_Pass zu entfernen:

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

Wenn Sie den Regex-Speicherort verwenden möchten, fügen Sie einfach die Argumente hinzu:

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

Ich benutze eine etwas modifizierte Version von kolbyjacks zweitem Ansatz mit ~ anstelle von ~*.

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

Ich habe den @kolbyjack-Code geändert, damit er funktioniert 

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

mit Parametern

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

sie müssen rewrite verwenden, um mit proxy_pass params zu übergeben

S3 Static Website Hosting Route alle Pfade zu Index.html

an Ihre Bedürfnisse angepasst wäre so etwas

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

wenn Sie in http://127.0.0.1:8080/query/params/ landen wollen

wenn Sie nach http://127.0.0.1:8080/service/query/params/ enden möchten, benötigen Sie so etwas

location /service/ {
    rewrite ^\/(.*) /$1 break;
    proxy_pass http://Apache;
}
4
Andrew Arnautov

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
1
AnJia

Um eine Umleitung ohne Abfragezeichenfolge umzuleiten, fügen Sie unter Zeilen im Serverblock unter der Überwachungsportzeile folgende Zeilen hinzu:

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

Mit Abfragezeichenfolge:

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