在 nginx 中哪个变量可以获取主域名

在 nginx 中哪个变量可以获取主域名

我想将所有这些子域以任何方案转发到 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

相关内容