我在Nginx上托pipe一个Rails应用程序,可以通过一组定义的域访问它。 对于这些域中的每一个,我也想转发www到非www。 现在我的configuration文件看起来像这样:
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个这样的域configuration,还有更多的来,这意味着维护这个列表会变得越来越麻烦。 我真正喜欢的是这样的:(伪代码)
%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上托pipe了其他域。 它必须是一组定义的域。
有没有办法做到这样的事情? 或者另一种方式,我可以清理configuration文件? 所有的build议欢迎!
编辑:
在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; }
这是less写(可能不是3域,但超过5或更多肯定),但现在我不得不添加一个新的域到3个地方! 有什么办法可以在一个地方只有域名列表?
您可以自动生成包含主机和server_name行的2个小文件,以便完整的configuration包括在内
映射$ http_host $ nonwww_host {
www.domain1.com domain1.com;
www.domain2.com domain2.com;
#等
}
服务器{
server_name www.domain1.com www.domain2.com; #等
重写^ http:// $ nonwww_host $ uri permanent;
}
有2个文件(可以说,hostmap.conf和server_names.conf),configuration可以有
包括hostmap.conf; #而不是“map $ http_host $ nonwww_host {...”
服务器{
包括server_names.conf; # “服务器名称 ...”
重写^ http:// $ nonwww_host $ uri permanent;
}
服务器{
server_name〜^ www \。(domain1 \ .com | domain2 \ .com | domain3 \ .com)$;
设置$ non_www_host $ 1;
重写^ http:// $ non_www_host $ uri permanent;
}
在server_name支持中,您至less需要0.7.40的nginx for regex。
2)用多个正则expression式来分割一个长度超过几个名字的正则expression式。
server_name〜^ www \。(domain1 \ .com | domain2 \ .com | domain3 \ .com)$; server_name〜^ www \。(domain4 \ .com | domain5 \ .com | domain6 \ .com)$;
3)多个server_names。 看起来很明显,但我认为你希望它是简洁的
server_name www.domain1.com; server_name www.domain2.com; #等