nginx map指令:为什么只允许在http级别?

che*_*ozo 13 nginx

在nginx中有一个非常有用的指令map.

但是只能在http关卡中使用它(请参阅http://nginx.org/en/docs/http/ngx_http_map_module.html#map中的文档).

例如,我有一个已server定义的,我想使用$url变量在此服务器中使用一些条件重定向.在内部使用此指令会非常方便,server但这是不可能的.为什么?

是的我也可以在http关卡上进行,但是在关卡中可能会有不同server的定义http,我希望将这些条件保留在server它们定义的部分中.

Tim*_*ark 7

很老的帖子,但我真的想给黑暗带来一些光明。答案本身很简单。

NGINX 中的DR;TL变量始终是全局的,并且一旦定义就可以从配置中的任何地方访问。因此,在 aserverlocation块中定义映射没有任何意义。

map 创建一个新变量,其值取决于第一个参数中指定的一个或多个源变量的值。

示例配置:

map $host $myvar {
example.com "test";
foo.com     "for";

}
Run Code Online (Sandbox Code Playgroud)

因为 NGINX 中的变量总是全局的,并且一旦定义就可以在配置中的任何其他地方使用。因此,将地图移动到某个位置或服务器块没有任何意义。有趣的事实与我们map指令是变量myvar何时接收其值或何时分配?

一旦变量将在您的配置中使用,map 就会将值分配给变量

这意味着您可以在 http 上下文中定义地图,但该值将在您访问时分配 $myvar在 nginx 配置。

回到您的问题:由于 NGINX 变量始终是全局的,因此map每个server块都有一个是有意义的,因为无论如何它们都是全局的。


D3H*_*ter -3

可以使用的范围map在nginx源码中是固定的。以下是 ngx_http_map_module.c 的部分代码。你可以看到map只能用在NGX_HTTP_MAIN_CONF这意味着http级别而已。

static ngx_command_t  ngx_http_map_commands[] = {                                                                                                      

    { ngx_string("map"),                                                                                                                               
      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2,                                                                                                
      ngx_http_map_block,                                                                                                                              
      NGX_HTTP_MAIN_CONF_OFFSET,                                                                                                                       
      0,                                                                                                                                               
      NULL },
Run Code Online (Sandbox Code Playgroud)

  • 说软件不允许这样做是显而易见的。问“为什么”就是问这个选择的理由是什么。 (12认同)