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

相关内容