所以我在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
时,重定向按预期工作。你能帮我解决一下我的问题吗?
答案 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)
// {
//
// }
}
}
作为前缀。