在这个例子中,我在 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.com
至sub.a.com
www.b.com
至b.com
www.c.com
至c.com
www.d.com
至d.com
每个域名都有自己的独立网站,由其通用的 CMS 处理。例如,这意味着即使b.com
使用c.com
相同的 CMS、管理面板和根目录,前端提供的页面也完全不同。此功能由 CMS 处理。
由于这种配置,我有 2 个用于 NGINX 的 .conf 文件,一个用于域 ac,一个用于 d。
问题来了。下面是我目前想到的办法,但并没有像上面概述的那样起作用。域名www.a.com
-www.c.com
似乎全部重定向到sub.a.com
。www.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_name
nginx
这个文件了解更多信息。
例如:
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
块与该域匹配。