英语不是我的母语,对于任何语言问题,请接受我的歉意。
我想要一个具有自动根权限的配置,无论域如何,看起来像这样(使用 nginx):
root /var/www/${http_host}/public
但我希望根域和“www”指向同一个目录,但不带“www”:
例子:
“www.mysite.com“ 和 ”我的站点“
根目录 /var/www/我的站点/民众
但 ”博客网“
根目录 /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
从标头中提取实际域名到变量。然后我们使用该变量来构建变量。Host
www.
$domain
$rootdir
但是,由于评论中提到的原因,此方法可能不适用于 SSL。在这种情况下,您需要实现一个配置管理系统,该系统从模板生成域的配置文件。