我正在对 nginx/1.14.1 服务器进行配置重构,该服务器充当 PHP-FPM 的反向代理。
现在的配置方式,我可以做到
# in a server {} section at a vhost there's
# set $base_domain domain.com;
# and then it includes another config file which has something like this:
if ($php_logs_path = '') {
set $php_logs_path /a/b/$base_domain/logs/$server_name.php_www_errors.log;
}
fastcgi_parma PHP_ADMIN_VALUE "error_log=$php_logs_path"
这工作正常,日志文件出现在正确的路径:
/a/b/domain.com/logs/some-sub-domain.domain.com.php_www_errors.log
但是,我并不特别喜欢我现在需要超过一百个虚拟主机来设置$base_domain
变量的事实。我浏览了nginx 文档,但我找不到只给出domain
没有子域的段的变量。
有没有一种简单的方法可以使用自定义变量来做到这一点?
map
使用一些全局指令怎么样?map
块是在http
上下文中定义的,因此您可以在全局 nginx 配置中将其与虚拟主机分开定义。更新
正如 OP 所指出的,此解决方案不适用于
.co.uk
域。我想到了写这个答案的其他例子——例如,Australian.com.au
,.net.au
, Ukrainian.com.ua
等等.in.ua
。好吧,由于国家 TLD 总是两个字母,我们可以假设 any.xx.xx
和.xxx.xx
domain 后缀很可能是一些国家的两个组成部分的 TLD。由于map
块表达式列表是从头到尾检查的,因此可以使用以下map
块捕获这些域:更新 2
刚刚发现,这些正则表达式中不需要多个捕获组:
你为什么不重复使用
$server_name
?此变量设置为块中定义的第一个 。只需确保第一个定义的名称是您想要的名称(并且可能已经是)。server_name
server