基于主机名的Nginx根没有www

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

我想要一个具有自动根的configuration,不pipe域如何,看起来像这样(使用nginx):

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

但是我想让根域和“www”指向同一个目录,但没有“www”:

例:

  1. www.mysite.com ”和“ mysite.com

    root / var / www / mysite.com / public

  2. 但是“ blog.mysite.com

    root / var / www / blog.mysite.com / public


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

是的,我看到还有其他类似的问题( 比如这个 ),但我很难删除“www”。 打扰一下!

我不会使用这样的通用server_name ,但是这应该工作,即使:

 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证书path中使用。

你可以像这样在http块中使用map

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

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

 root /var/www/$rootdir/public; 

map指令中,我们使用正则expression式将包含HTTP请求Host头的$http_hostvariables转换$http_host $rootdir

在正则expression式中,我们通过排除www.来将实际域名从Host头部提取到$domainvariableswww. 前缀如果存在。 然后我们使用$domainvariables来构build$rootdirvariables。

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