我想将所有这些子域以任何方案转发到 https 中的相应主域。我不想有多个服务器指令。
server {
server_name *.autocosts.info
*.autocouts.info
*.autocostos.info
*.autocosti.info
*.autocustos.info
*.autocosturi.info
*.autokoszty.info;
listen 80;
listen 404;
listen 443 ssl;
return 301 https://$host$request_uri;
}
这似乎不起作用。$host
包括子域名吗?我怎样才能只获取主域名(不包括子域名)?
我知道我可以得到主域使用server_name ~^(www\.)?(?<domain>.+)$;
但不限于上述域列表。
答案1
正则表达式来救援!
^(\*\.)?([a-z\d][a-z\d-]*[a-z\d]\.)(?<maindomain>auto[a-z\d-]*[a-z\d]\.info)+$
^(\*\.)?([a-z\d][a-z\d-]*[a-z\d]\.)
匹配子域名。
?<maindomain>
将裸域存储在名为$maindomain
auto
匹配所有域中存在的“auto”。
[a-z\d-]*[a-z\d]\
匹配您域名的其余部分
\.info+
匹配您域名的 .info 部分
(未经在 nginx 中测试,但应该可以作为正则表达式工作)。
所用文档:来自 nginx.org 网站
因此让我们修复你的服务器块:
server {
server_name ~^(\*\.)?([a-z\d][a-z\d-]*[a-z\d]\.)(?<maindomain>auto[a-z\d-]*[a-z\d]\.info)+$;
listen 80;
listen 404;
listen 443 ssl;
return 301 https://$maindomain$request_uri;
}
访问该网站时会产生以下结果:
curl -I oi3j2.autocostos.info
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Wed, 17 Jul 2019 15:48:54 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: https://autocostos.info