使用AWS Elastic Load balancer和Nginx的非www到www

时间:2013-04-06 06:35:48

标签: nginx amazon-web-services amazon-ec2 ubuntu-12.04 http-redirect

我在example.com上运行了一个应用程序,现在我想将所有流量重定向到www.example.com,因为我们正在为您的网站与Akamai的CDN进行合作。我的域名停放在Route53中,将Elastic Load Balancer的CNAME添加到指向* .example.com的CNAME,我运行的是具有以下配置的nginx web服务器。如果我使用这个配置ELB抛出实例,现在domain.com工作正常,www.domain.com罚款,但重定向没有发生。

server {
        listen 80;
        server_name example.com;
#       rewrite ^    http://www.example.com$request_uri? permanent;
        root /home/ubuntu/apps/st/public;
        passenger_enabled on;
}

但我无法实现重定向。

还尝试添加其值为负载均衡器的cname的PTR。

尝试更改nginx配置,如您所见

rewrite ^ http://www.example.com$request_uri? permanent;

即使这样也行不通。

一旦我添加上面的行,app实例就会继续,ELB会抛出堆栈。

解决方案是什么,我一直试图实现这一目标,自3-4天起,它现在成为一个夜魇,请帮助我。我也在aws论坛中放了帖子和帖子,没有任何帮助。

3 个答案:

答案 0 :(得分:6)

我在重定向方面遇到了同样的问题(使用与此处所示相同的nginx conf代码)。

然后,我将我的重定向配置作为最后一个服务器{}块(在我的domain.com配置文件的末尾),并且ELB能够再次找到实例。

我没有仔细研究它,但似乎vhost处理是按顺序完成的,所以当ELB命中我的服务器的IP地址时,它会落在第一个定义的服务器{}块上,在我的例子中是重定向。 Nginx抛出一个301返回代码,ELB因为它不是200而吓坏了。

只是一个猜测。

所以,我的配置(真正的vhost在顶部,重定向是最后的):

  

less /etc/nginx/sites-enabled/domain.com

server {
    listen 80;
    server_name domain.com;
    .....
}

server {
    listen       80;
    server_name  www.domain.com;
    return       301 http://domain.com$request_uri;
}

答案 1 :(得分:2)

我不熟悉Amazon ELB,但也许我可以帮助使用nginx部分。

对于您的场景,我通常在nginx中使用两个服务器块。一个用于处理重写/重定向(example.com),另一个用于处理常规站点(www.example.com)。两个块都可以在同一个文件中。

# for redirecting only...
server {
    listen 80;
    server_name example.com;

    # re-written to www...
    location / {
       rewrite ^(.*)$ $scheme://www.example.com$1 permanent;
    }
}

# regular web site config here...
server {
    listen 80;
    server_name www.example.com;

    root /home/ubuntu/apps/st/public;
    passenger_enabled on;
    ...
}

答案 2 :(得分:0)

旧问题,但由于它出现在搜索中。

现在可以使用AWS应用程序负载平衡器重定向到www(或任何其他主机)。与使用nginx config相比,这可能更方便管理。

https://docs.aws.amazon.com/elasticloadbalancing/latest/application/listener-update-rules.html