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

时间:2016-10-15 00:17:28

标签: redirect nginx nginx-location

所以我在nginx中定义了一个虚拟主机,它应该重定向到两个不同的域。使用domain-x.com的任何网址都应该重定向到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之类的任何网址都被重定向到[IP]something(IP是运行nginx的服务器的地址),这也适用于/info结束最新为[IP]info。当我输入[IP]/info时,重定向按预期工作。你能帮我解决一下我的问题吗?

1 个答案:

答案 0 :(得分:1)

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

通过将默认return包装在默认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; } } ,以便正确评估所有位置块。例如:

rewrite

或者,在return前面使用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; } ,因为这些指令按顺序进行评估。例如:

/info

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

在这两个示例中,我假设/info URI完全匹配,但两者都很容易修改为接受using System; using System.Collections; namespace DataStructures { public class List<T>: IList<T>, IEnumerable where T: IComparable<T> { private const int DEFAULT_SIZE = 8; private T[] listArray; private int arrayElementCounter = 0; public List() { listArray = new T[DEFAULT_SIZE]; } public int Count{get{return this.arrayElementCounter;}} public void Add(T element) { growIfArrayIsFull(); this.listArray[arrayElementCounter] = element; this.arrayElementCounter++; } public void Clear() { listArray = new T[DEFAULT_SIZE]; } public bool Contains(T element) { for (int i = 0; i <= arrayElementCounter; i++) { if (this.listArray.Equals(element)) { return true; } } return false; } private void growIfArrayIsFull() { T[] newListArray; if (this.arrayElementCounter == this.listArray.Length) { newListArray = new T[this.listArray.Length * 2]; Array.Copy(listArray, newListArray, arrayElementCounter); listArray = newListArray; } else { return; } } public IEnumerator GetEnumerator() { return listArray.GetEnumerator(); } // Ignore this First // private int CompareTo(T otherElement) // { // // } } } 作为前缀。

有关详细信息,请参阅thisthis