NGINX将所有域redirect到一个,而不是服务器自己的公有和私有IP地址

我一直没有find符合我的特定情况的问题,所以希望这不是重复的,如果是的话,我表示歉意。

负载平衡器后面有4个Web服务器。 我只想要www.mydomain.com,123.123.123.123(我的服务器的公共IP地址)和456.456.456.456(我的服务器的内部networkingIP地址)工作,其他任何东西都应该redirect到www.mydomain.com。

为什么:我需要将所有内容发送到www.mydomain.com,因为我们已经有人build立了指向我们IP地址的其他域名(www.otherdomain.com),所以它就像我们网站的一面镜子。 我们不知道他们为什么这样做,但Google开始抓取他们的网站,就好像它完全是一个不同的网站,并造成麻烦。 我需要允许服务器的IP地址,因为我们通过一个自定义的API来使用服务器的内部聊天来绕过负载平衡器。

我能find的唯一的解决scheme,包括IP地址redirect到www.mydomain.com,或者他们最终没有redirect。

这是我目前的configuration(截断简单):

server { listen 80; server_name www.mydomain.com 123.123.123.123 456.456.456.456; } server { listen 80 default; server_name _; rewrite ^ http://www.mydomain.com$request_uri?; } 

预期:请求到正确的域或IP地址匹配第一个规则。 所有其他请求匹配第二条规则并redirect。 实际:根本没有得到redirect,我假设,因为NGINX只是匹配的IP地址,无论域到第一条规则。 也可能是负载平衡器搞砸了? 如果有帮助,我正在使用Rackspace云负载平衡器。

我也试过这个configuration:

 server { listen 80 default; server_name www.mydomain.com; } server { listen 80; server_name _; rewrite ^ http://www.mydomain.com$request_uri?; } 

这与之前的结果相同。 似乎没有任何redirect。

任何想法如何我可以解决这个问题?

谢谢你的帮助!

我得到了它的工作。 Sameer很近,但我不确定他是否理解我的确切问题。 这是解决我的问题;

 server { listen 80; server_name www.mydomain.com 123.123.123.123 456.456.456.456; } server { listen 80 default_server; server_name _; rewrite ^ http://www.mydomain.com$request_uri?; } 

通过以上所述,您可以通过www.mydomain.com或直接的内部和公共IP地址加载站点,但是如果尝试以任何其他方式加载它,您将被redirect。

奇怪的是…这是我上面尝试的第一个例子。 我不知道为什么它不起作用,现在它工作。 也许是因为“listen 80 default”已被弃用,而倾向于“listen 80 default_server”。 或者也许我会困惑的事情将testing所有4个节点。 无论哪种方式,这个定义似乎正在工作!

 server { listen 456.456.456.456:80; server_name mydomain.com; # I am more lenient with internal and this will bypass the LB } server { listen 80 default; server_name _; if ($host != www.mydomain.com){ rewrite ^ http://www.mydomain.com$request_uri?; } } 

如果内部和外部没有什么不同,那么你可以放弃第一个服务器部分。 理想情况下,您应该只关心$ host头,这是一个标准的HTTP头。 使用HTTP负载均衡器,您应该使用负载均衡器的IP,而不是您的机器的公共IP,因为这将绕过LB.