NginX 子域名

NginX 子域名

正在迁移服务器,但设置子域名却毫无进展。我所期望的行为相当简单:

  • www.domain.com & domain.com --> /var/www/live/
  • *.domain.com --> /var/www/*/(假设子目录存在,否则重定向到主站点)

我尝试过在几种配置中使用 $host,也尝试过使用以下多种变体:

server_name ~^(.*)\.domain\.com$;

root /var/www/$1;

server_name ~^(?<subdomain>.+)\.domain\.com$;

root /var/www/$subdomain

这是 NginX 的基本行为,但我完全不知所措,并且浪费了太多时间试图破解它。有人能解释一下解决方案吗?

提前致谢!

答案1

尝试这个:

server {
    listen 80;
    server_name example.com *.example.com;
    root /var/www/example.com/$subdomain;
    set $subdomain "";
    if ($host ~* ^([a-z0-9-\.]+)\.example.com$) {
        set $subdomain $1;
    }
    if ($host ~* ^(www.)?example.com$) {
        set $subdomain "live";
    }

}

答案2

您的第二server_name条指令看起来正确并且应该有效(在我看来是最好的解决方案)。文档对于旧版本的 PCRE 建议以下语法,因此您可以尝试以下方法:

server_name ~^(?P<subdomain>.+)\.domain\.com$;
root /var/www/$subdomain;

答案3

其他人正在使用地图来帮助解决这个问题。以下是地图直接文档

其他需要检查的事项:检查您使用的 Nginx 版本是否与最新版本一致。如果您正在阅读在线文档,它们可能引用了比您实际拥有的行为更新的行为。

另外,据我了解,反向引用语法(例如?<subdomain>)部分启用自libpcre。检查man pcrepattern它是否有关于“命名子模式”的部分。

相关内容