基于主机名的 Nginx 根目录,不含 www

基于主机名的 Nginx 根目录,不含 www

英语不是我的母语,对于任何语言问题,请接受我的歉意。

我想要一个具有自动根权限的配置,无论域如何,看起来像这样(使用 nginx):

root /var/www/${http_host}/public

但我希望根域和“www”指向同一个目录,但不带“www”:

例子:

  1. www.mysite.com“ 和 ”我的站点

    根目录 /var/www/我的站点/民众

  2. 但 ”博客网

    根目录 /var/www/博客网/民众


也就是说,只有“www”应该指向名称中不包含“www”的目录。

是的,我看到还有其他类似的问题(像这个),但我很难去掉“www”。不好意思!

我不会使用这种通用的服务器名称,但这甚至可以用于:

server_name ~.+$;

但同样如此:

listen 443 ssl http2;

server_name ~ ^((www|blog|account|bbs)\.)?mysite.com$;

root /var/www/${http_host}/public

ssl_certificate /ssl/${http_host}/{http_host}.pem
ssl_certificate_key /ss/${http_host}/{http_host}.key

注意:它应该与 ssl 证书路径一起工作。

答案1

您可以在块map中使用http如下内容:

map $http_host $rootdir {
    ~^(?:www\.)?(?<domain>.+)$ $domain;
}

然后在您的server块中使用以下内容:

root /var/www/${rootdir}/public;

map指令中,我们将$http_host包含 HTTP 请求Host标头的变量转换为$rootdir使用正则表达式。

在正则表达式中,我们通过排除前缀(如果存在)$domain从标头中提取实际域名到变量。然后我们使用该变量来构建变量。Hostwww.$domain$rootdir

但是,由于评论中提到的原因,此方法可能不适用于 SSL。在这种情况下,您需要实现一个配置管理系统,该系统从模板生成域的配置文件。

相关内容