Redirect 如何将特定位置重定向到其他域上的该位置?

Redirect 如何将特定位置重定向到其他域上的该位置?,redirect,nginx,nginx-location,Redirect,Nginx,Nginx Location,因此,我在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 $s

因此,我在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 /info/ {
    return 307 $scheme://domain-b.com/info;
}
以及:

我还尝试了
location=/info/
,但没有成功


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

基本问题是
服务器
块中的裸返回覆盖了同一级别的任何
位置

通过将默认
返回值
包装在默认
位置
块中来保护它,以便正确计算所有位置块。例如:

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;
    }
}
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;
}
或者,在
返回
前面使用
重写
,因为这些指令是按顺序计算的。例如:

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;
    }
}
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
作为前缀


有关更多详细信息,请参阅和

我尝试了你的两种解决方案,结果都是一样的:
[IP]info/
这次在末尾加了一个斜杠。虽然我禁用了所有其他虚拟主机,但我开始怀疑是否有其他设置干扰。我建议您尝试使用浏览器插件/工具来分析HTTP响应中的
位置
标头,并准确确定哪个服务器返回的是IP地址而不是域名。应该使用
curl
早期的。。。您正确地怀疑是目标服务器造成了问题。