清理 Nginx 配置:一个 Rails 应用程序、多个域、重定向到非 www 域

清理 Nginx 配置:一个 Rails 应用程序、多个域、重定向到非 www 域

我在 Nginx 上托管了一个 Rails 应用,可通过一组定义的域进行访问。对于每个域,我还想将 www 转发到非 www。现在我的配置文件如下所示:

server {
    listen      80;
    server_name www.domain1.com;
    rewrite ^ http://domain1.com$uri permanent;
}

server {
    listen      80;
    server_name www.domain2.com;
    rewrite ^ http://domain2.com$uri permanent;
}

server {
    listen      80;
    server_name www.domain3.com;
    rewrite ^ http://domain3.com$uri permanent;
}

server {
    listen            80;
    server_name       domain1.com domain2.com domain3.com;
    root              /home/rails/apps/myapp/current/public;
    passenger_enabled on;
}

因此,我必须重复将 www 转发到每个域的非 www 部分,并将该域作为 server_name 添加到最后一个 server {} 指令中。目前,我已经配置了大约 15 个域,并且还会有更多域,这意味着维护该列表将变得越来越麻烦。我真正想要的是这样的:(伪代码)

%domains = [domain1.com, domain2.com, domain3.com]

for each %domain in domains
    server {
        listen      80;
        server_name www.%domain;
        rewrite ^ http://%domain$uri permanent;
    }
end

server {
    listen            80;
    server_name       %domains;
    root              /home/rails/apps/myapp/current/public;
    passenger_enabled on;
}

有一件事我无法做到,那就是使用通配符将所有域名转发到其非 www 变体,因为我还在同一个 Nginx 上托管其他域名。它必须是一组定义的域名。

有什么方法可以实现这样的效果吗?或者我可以用其他方法清理配置文件?欢迎提出所有建议!

编辑:

在 rzab 的回答的帮助下,我可以将其归结为:

map $http_host $non_www_host {
  www.domain1.com domain1.com;
  www.domain2.com domain2.com;
  www.domain3.com domain3.com;
}

server {
  listen        80;
  server_name   www.domain1.com www.domain2.com www.domain3.com;
  rewrite ^     http://$non_www_host$uri permanent;
}

server {
    listen              80;
    server_name         domain1.com domain2.com domain3.com;
    root                /home/rails/apps/myapp/current/public;
    passenger_enabled   on;
}

需要写入的内容较少(可能不是 3 个域名,但肯定超过 5 个或更多),但现在我必须将新域名添加到 3 个位置!有什么方法可以让我在一个地方获得域名列表吗?

答案1

您可以自动生成 2 个包含主机和 server_name 行映射的小文件,以便完整配置包括

地图 $http_host $nonwww_host {
        www.域名1.com 域名1.com;
        www.域名2.com 域名2.com;
        # ETC。
}

服务器 {     
        服务器名称 www.domain1.com www.domain2.com; # 等等
        重写 ^ http://$nonwww_host$uri 永久;
}

有 2 个文件(比如 hostmap.conf 和 server_names.conf),配置可以有

包括 hostmap.conf; # 而不是“map $http_host $nonwww_host { ...”

服务器 {
        包括服务器名称.conf;#“服务器名称...”
        重写 ^ http://$nonwww_host$uri 永久;
}    

答案2

服务器 {
        服务器名称 ~^www\.(域1\.com|域2\.com|域3\.com)$;
        设置$non_www_host $1;
        重写 ^ http://$non_www_host$uri 永久;
}

您至少需要 0.7.40 nginx 才能支持 server_name 中的正则表达式。

2)使用多个正则表达式来拆分包含多个名称的长正则表达式。

服务器名称 ~^www\.(域1\.com|域2\.com|域3\.com)$;
服务器名称 ~^www\.(domain4\.com|domain5\.com|domain6\.com)$;

3) 多个服务器名称。这看起来很明显,但我认为你希望它简洁

服务器名称www.domain1.com;
服务器名称www.domain2.com;
# ETC。

相关内容