我一直找不到符合我特定场景的问题,因此希望这不是重复的,如果是的话我很抱歉。
我在负载均衡器后面有 4 个 Web 服务器。我只希望 www.mydomain.com、123.123.123.123(我的服务器的公共 IP 地址)和 456.456.456.456(我的服务器的内部网络 IP 地址)能够正常工作,其他任何地址都应重定向到 www.mydomain.com。
原因:我需要将所有内容发送到 www.mydomain.com,因为有人设置了指向我们 IP 地址的其他域 (www.otherdomain.com),因此它就像我们网站的镜像一样。我们不知道他们为什么这样做,但 Google 开始抓取他们的网站,就好像它是一个完全不同的网站一样,这会带来麻烦。我需要允许服务器的 IP 地址通过,因为我们通过自定义 API 将其用于内部服务器聊天,以绕过负载平衡器。
我能找到的唯一解决方案是将所有内容(包括 IP 地址)重定向到 www.mydomain.com,或者最终什么都不重定向。
这是我当前的配置(为简单起见,已截断):
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 地址的请求与第一条规则匹配。所有其他请求都与第二条规则匹配并被重定向。实际:根本没有任何内容被重定向,我假设是因为 NGINX 只是将 IP 地址与第一条规则匹配,而不管域是什么。也可能是负载均衡器搞砸了?我正在使用 Rackspace 云负载均衡器,如果有帮助的话。
我也尝试过这个配置:
server {
listen 80 default;
server_name www.mydomain.com;
}
server {
listen 80;
server_name _;
rewrite ^ http://www.mydomain.com$request_uri?;
}
这与上一个结果相同。似乎没有任何东西被重定向。
有什么想法可以修复此问题吗?
感谢您的帮助!
答案1
我成功了。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 地址加载网站,但如果您尝试以其他方式加载,您将被重定向。
奇怪的是……这是我上面尝试的第一个示例。我不知道为什么它当时不起作用而现在却起作用了。也许是因为“listen 80 default”已被弃用,取而代之的是“listen 80 default_server”。或者也许我在测试所有 4 个节点时混淆了事情。无论如何,它现在似乎可以按照这个定义工作!
答案2
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。