【问题标题】:How to redirect a specific location to that location on a different domain?如何将特定位置重定向到不同域上的该位置?
【发布时间】:2017-02-24 12:12:24
【问题描述】:

所以我在 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 的服务器的地址),这也适用于/info,它最终是[IP]info。当我输入 [IP]/info 时,重定向按预期工作。你能帮我解决我的问题吗?

【问题讨论】:

    标签: redirect nginx nginx-location


    【解决方案1】:

    根本问题是server 块中的裸返回会覆盖同一级别的任何location 块。

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

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

    有关详细信息,请参阅 thisthis

    【讨论】:

    • 我尝试了您的两种解决方案,它们给了我相同的结果:[IP]info/ 这次是在末尾加上斜线。尽管我确实禁用了所有其他虚拟主机,但我开始怀疑是否有其他设置干扰。
    • 我建议您尝试使用浏览器插件/工具来分析 HTTP 响应中的 Location 标头,并准确识别哪个服务器返回的是 IP 地址而不是域名。
    • 早先应该使用curl...您怀疑目标服务器正在制造问题是正确的。
    猜你喜欢
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    相关资源
    最近更新 更多