Nginx leitet ohne nachfolgende URI zu einer anderen Domäne weiter

Nginx leitet ohne nachfolgende URI zu einer anderen Domäne weiter

Ich versuche, http://foo.mydomain.xyz/one/two/three.jsondurch den Anruf zu kommen http://bar.mydomain.xyz/cat/one/two/three.json. Ich verwende die folgende Konfiguration:

server {
        listen 80;
        listen [::]:80;
        server_name bar.mydomain.xyz;
        absolute_redirect off;

        location / {
          proxy_pass http://localhost:8080;
        }

        location /cat {
          rewrite ^(/cat) http://foo.mydomain.xyz$request_uri permanent;
        }
}
server {
        listen 80;
        listen [::]:80;
        server_name foo.mydomain.xyz;

        location / {
          proxy_pass http://localhost:7070;
        }
}

Wenn ich diese Konfiguration verwende, http://bar.mydomain.xyz/cat/werde ich http://foo.mydomain.xyz/erfolgreich zu weitergeleitet. Aber wenn ich anrufe, http://bar.mydomain.xyz/cat/one/two/three.jsonwird zurückgegeben http://foo.mydomain.xyz/cat/one/two/three.json. Beachten Sie die/Katzewird nicht aus der URL entfernt. Wie kann ich das lösen?

Antwort1

Ihre rewriteAnweisung ändert den Domänennamen, sonst aber nichts. Der Wert $request_uriist die ursprüngliche URI einschließlich des führenden /catTeils. Sie müssen den letzten Teil der URI im regulären Ausdruck erfassen.

Zum Beispiel:

rewrite ^/cat/(.*)$ http://foo.example.com/$1 permanent;

Oder vielleicht:

rewrite ^/cat(?:/(.*))?$ http://foo.example.com/$1 permanent;

Antwort2

locationEin anderer Ansatz besteht darin, den Teil in der Direktive zu erfassen :

location / {
    proxy_pass http://localhost:8080;
}

location ~ ^/cat(/.+)$ {
    return 301 http://foo.example.com$1$is_args$args;
}

verwandte Informationen