Nginx は末尾の URI なしで別のドメインにリダイレクトします

Nginx は末尾の URI なしで別のドメインにリダイレクトします

http://foo.mydomain.xyz/one/two/three.jsonを呼び出して取得しようとしていますhttp://bar.mydomain.xyz/cat/one/two/three.json。次の構成を使用しています:

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

呼び出し時にこの設定を使用すると、正常にhttp://bar.mydomain.xyz/cat/リダイレクトされますhttp://foo.mydomain.xyz/。しかし、呼び出し時にhttp://bar.mydomain.xyz/cat/one/two/three.jsonが返されますhttp://foo.mydomain.xyz/cat/one/two/three.json。注意してください。/猫URL から削除されません。どうすれば解決できますか?

答え1

このrewriteステートメントではドメイン名が変更されていますが、それ以外は何も変更されていません。 の値は、$request_uri先頭部分を含む元の URI です/cat。正規表現で URI の後半部分をキャプチャする必要があります。

例えば:

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

または多分:

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

答え2

別のアプローチは、ディレクティブ内の部分をキャプチャすることですlocation

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

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

関連情報