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

Связанный контент