在一台主机上redirect多个域的正确方法 – NGINX

在这个例子中,我有2个不同的CMS和5个不同的域的4个网站。

a.com sub.a.com b.com c.com在CMS1上
d.com在CMS2上

http应该redirect到https
a.com www.a.com www.sub.a.comsub.a.com
www.b.comb.com
www.c.comc.com
www.d.comd.com

每个域名都有自己的独立网站,由其共同的CMS进行处理。 例如,这意味着即使b.comc.com使用相同的CMS,pipe理面板和根目录, 前台服务的页面是完全不同的。 该function由CMS处理。

由于这个configuration,我有2个用于NGINX的.conf文件,一个用于域ac,一个用于d。

问题来了。 以下是我到目前为止所提出的,但不符合上述的方式。 域名www.a.comwww.c.com似乎都redirect到sub.a.comwww.sub.a.com不会redirect到sub.a.com 。 我看着这一切都错了吗?

a.com.conf

 server { listen 80; server_name a.com www.a.com sub.a.com www.sub.a.com b.com www.b.com c.com www.c.dom; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name www.a.com www.sub.a.com; return 301 https://sub.a.com$request_uri; } server { listen 443 ssl; server_name www.b.com; return 301 https://b.com$request_uri; } server { listen 443 ssl; server_name www.c.com; return 301 https://c.com$request_uri; } server { listen 443 ssl; server_name a.com sub.a.com b.com c.com; root /srv/a.com/www; include snippets/ssl-a.com.conf; include snippets/ssl-params.conf; # REST OF CONFIG } 

d.com.conf

 server { listen 80; server_name d.com www.d.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name www.d.com; return 301 https://d.com$request_uri; } server { listen 443 ssl; server_name d.com; root /srv/d.com/www; include snippets/ssl-d.com.conf; include snippets/ssl-params.conf; # REST OF CONFIG } 

你应该使用$host而不是$server_name如果你想让nginxselect用来发出请求的名字的话。 请参阅此文档了解更多

例如:

 server { listen 80; server_name a.com www.a.com sub.a.com www.sub.a.com b.com www.b.com c.com www.c.dom; return 301 https://$host$request_uri; } 

在HTTP虚拟服务器部分,我总是使用最终域作为redirect目标。

例如,现在当请求进入http://www.b.com ,它将redirect到https://www.b.com ,然后到https://b.com ,导致客户端的两个redirect他到达最终的目的地。 但是,要实现这一点,需要为server_name使用正则expression式,并在redirect中使用其捕获的值,例如:

 server { listen 80; server_name ~^(?:www)?\.(<domain>.+)\.com$; return 301 https://$domain.com; } 

这个正则expression式将捕获www.之间的一切www. 前缀和.com后缀放入$ 1,或者www. 前缀不存在,那么之前的一切。 然后$1被用作redirect目的地。

您的configuration的另一个问题是请求http://www.a.com 。 第一个redirect将转到https://www.a.com ,将redirect到https://sub.a.com ,因为第二个server块与该域匹配。