在一个主机上重定向多个域的正确方法 - NGINX

在一个主机上重定向多个域的正确方法 - NGINX

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

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

http应重定向至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.com使用c.com相同的 CMS、管理面板和根目录,前端提供的页面也完全不同。此功能由 CMS 处理。

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

问题来了。下面是我目前想到的办法,但并没有像上面概述的那样起作用。域名www.a.com-www.c.com似乎全部重定向到sub.a.comwww.sub.a.com没有重定向到sub.a.com。我是不是看错了?

一个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
}

答案1

如果您想选择用于发出请求的名称,则应使用$host而不是。请参阅$server_namenginx这个文件了解更多信息。

例如:

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;
}

答案2

在 HTTP 虚拟服务器部分,我始终使用最终域作为重定向目的地。

例如,现在当请求进入 时http://www.b.com,它将重定向到https://www.b.com,然后重定向到https://b.com,从而导致客户端进行两次重定向,直到到达最终目的地。但是,要实现这一点,需要对 和 的正则表达式进行使用,server_name并在重定向中使用其捕获的值,例如:

server {
    listen 80;

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

该正则表达式将把www.前缀和.com后缀之间的所有内容捕获到 $1 中,或者如果www.前缀不存在,则.com.之前的所有内容$1将用作重定向目的地。

您的配置的另一个问题是对 的请求http://www.a.com。第一个重定向将转到https://www.a.com,后者会将其重定向到https://sub.a.com,因为第二个server块与该域匹配。

相关内容