我在 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。