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

zysjyyx4  于 2023-08-03  发布在  Nginx
关注(0)|答案(3)|浏览(122)

Nginx map中有一个非常有用的指令。
但是只能在http级别上使用它(请参阅此处的文档http://nginx.org/en/docs/http/ngx_http_map_module.html#map)。
例如,我定义了一个server,我想在这个服务器中使用$url变量使用一些条件重定向。在server中使用这个指令会非常方便,但这是不可能的。为什么
是的,我也可以在http级别上这样做,但在http级别上可能有不同的server定义,我希望将这些条件保留在server部分中。

8zzbczxx

8zzbczxx1#

这是一个很古老的帖子,但我真的想给黑暗带来一些光明。答案本身很简单。
DR;TLNGINX中的变量始终是全局的,一旦定义,就可以从配置中的任何位置访问。因此,在serverlocation块中定义Map没有任何意义。
map创建一个新变量,其值取决于第一个参数中指定的一个或多个源变量的值。
示例配置:

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

}

字符串
因为NGINX中的变量总是全局的,一旦定义,在配置中的任何其他地方都可用。因此,将Map移动到位置或服务器块中没有任何意义。我们的map指令有趣的事实是变量myvar何时会收到它的值,或者何时会被赋值?

map会在您的配置中使用变量后将该值赋给变量

这意味着你可以在http上下文中定义map,但是这个值会在你访问nginx配置中$myvar的时候赋值。
回到你的问题:因为NGINX变量总是全局的,所以每个server块有一个map是没有意义的,因为它们无论如何都是全局的。

vh0rcniy

vh0rcniy2#

我认为这真的是关于开发人员 * 构建 * 模块是什么和 * 它实际上是如何 *。
我看了看引擎盖下的源代码,我会建议相同的更清晰。我还使用了以下指南来理解代码的含义:https://www.evanmiller.org/nginx-modules-guide.html
ngx_http_map_module的源代码是here
如果我看一下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 },

字符串
1.第一个参数只定义指令字符串
1.第二个参数很有趣。type字段是:
类型是一组标志,指示指令在何处法律的以及指令接受多少个参数。
我们在这里看到,定义的字段是NGX_HTTP_MAIN_CONF,这使得该指令在http级别有效。但是我们没有看到对应的标志NGX_HTTP_SRV_CONF-(对于server)或NGX_HTTP_LOC_CONF(对于location级别)。
因此,ngx_http_map_module的这个特定实现只在http级别工作是有意义的。
现在,它可以在服务器/位置级别上工作吗?从理论上讲,它应该。但它需要在源代码中做出一些贡献。如果你认为它会成为一个有用的功能,请做出贡献:)

ef1yzkbh

ef1yzkbh3#

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 },

字符串

相关问题