nginx 在位置设置变量

Bog*_*tan 51 nginx

我正在尝试优化我的 nginx 配置,因此可以设置一个变量,并且所有位置路径都会自动更新。我有四行有问题:

server_name php.domain.com;
root /srv/web/vhosts/php/web;
error_log /srv/web/vhosts/php/logs/error.log;
access_log /srv/web/vhosts/php/logs/access.log;
Run Code Online (Sandbox Code Playgroud)

我想要实现的是设置一个变量(在本例中为“php”)并将其包含到 config.php 中。

set $variable "php";
server_name $variable.domain.com;
root /srv/web/vhosts/$variable/web;
error_log /srv/web/vhosts/$variable/logs/error.log;
access_log /srv/web/vhosts/$variable/logs/access.log;
Run Code Online (Sandbox Code Playgroud)

然而,nginx 忽略了这个配置中的变量。我做错了什么还是不可能在位置路径中使用变量?

Xav*_*cas 77

变量不能在任何地方声明,也不能在任何指令中使用。

由于set指令的文档是:

Syntax:   set $variable value;
Default:  —
Context:  server, location, if
Run Code Online (Sandbox Code Playgroud)

直接后果是您不能在http块中使用自定义变量。

更新:在此聊天室AlexeyTen进行讨论和实验后。

  • access_log可以包含有限制的变量。其中,缺少缓冲以及不能在变量中声明前导斜杠事实
  • error_log 根本不适用于变量。
  • root 指令可以包含变量。
  • server_name指令只允许严格$hostname值作为类似变量的符号。

  • 好吧,`$hostname` 是唯一允许的变量。https://github.com/nginx/nginx/blob/bb8c0683da773566e09797ef8a4ee00ad1e0f956/src/http/ngx_http_core_module.c#L4370 其实更像是一个神奇的常数,而不是一个真正的变量 (6认同)
  • 这可能是有史以来研究得最好的 SF 答案。感谢你们俩 /Cc @AlexeyTen (4认同)
  • `access_log`/`error_log` 使用变量,但有一些限制。`server_name` 不能包含变量。 (2认同)
  • 让我们[在聊天中继续讨论](http://chat.stackexchange.com/rooms/18730/discussion-between-alexey-ten-and-xavier-lucas)。 (2认同)