如何将特定位置重定向到不同域上的该位置?

How to redirect a specific location to that location on a different domain?

所以我在 nginx 中定义了一个虚拟主机,它应该重定向到两个不同的域。任何使用 domain-x.com 的 URL 都应该重定向到 domain-a.com,但 domain-x.com/info 应该重定向到 domain-b.com/info。我已经用两种不同的方式尝试过了。

通常我的条目是这样的:

server {
    listen 80;
    server_name domain-x.com www.domain-x.com;

    location ...

    return 307 $scheme://domain-a.com$request_uri;
}

这使得来自 domain-x.com 的一般重定向在一定程度上起作用。对于 location 我尝试了两种重定向方式:

location /info/ {
    return 307 $scheme://domain-b.com/info;
}

和:

location /info/ {
    proxy_pass http://domain-b.com/;
}

我也用 location = /info/ 试过了,但没有用。

我 运行 遇到的问题是 domain-x.com/something 之类的任何 URL 都被重定向到 [IP]something (IP 是 nginx 运行s),这也适用于 /info,最终为 [IP]info。当我输入 [IP]/info 时,重定向按预期工作。你能帮我解决我的问题吗?

根本问题是 server 块中的裸体 return 覆盖了同一级别的任何 location 块。

通过将默认 return 包装在默认 location 块中来保护默认 return ,以便正确评估所有位置块。例如:

server {
    listen 80;
    server_name domain-x.com www.domain-x.com;

    location / {
        return 307 $scheme://domain-a.com$request_uri;
    }
    location = /info {
        return 307 $scheme://domain-b.com/info;
    }
}

或者,在 return 前面使用 rewrite,因为这些指令是按顺序计算的。例如:

server {
    listen 80;
    server_name domain-x.com www.domain-x.com;

    rewrite ^/info$ $scheme://domain-b.com/info redirect;
    return 307 $scheme://domain-a.com$request_uri;
}

当然,第二个示例使用 302 响应而不是您想要的 307 响应。

在这两个示例中,我都假定 /info URI 完全匹配,但都可以轻松修改为接受 /info 作为前缀。

有关详细信息,请参阅 this and this