Nginx map
中有一个非常有用的指令。
但是只能在http
级别上使用它(请参阅此处的文档http://nginx.org/en/docs/http/ngx_http_map_module.html#map)。
例如,我定义了一个server
,我想在这个服务器中使用$url
变量使用一些条件重定向。在server
中使用这个指令会非常方便,但这是不可能的。为什么
是的,我也可以在http
级别上这样做,但在http
级别上可能有不同的server
定义,我希望将这些条件保留在server
部分中。
3条答案
按热度按时间8zzbczxx1#
这是一个很古老的帖子,但我真的想给黑暗带来一些光明。答案本身很简单。
DR;TLNGINX中的变量始终是全局的,一旦定义,就可以从配置中的任何位置访问。因此,在
server
或location
块中定义Map没有任何意义。map
创建一个新变量,其值取决于第一个参数中指定的一个或多个源变量的值。示例配置:
字符串
因为NGINX中的变量总是全局的,一旦定义,在配置中的任何其他地方都可用。因此,将Map移动到位置或服务器块中没有任何意义。我们的
map
指令有趣的事实是变量myvar
何时会收到它的值,或者何时会被赋值?map会在您的配置中使用变量后将该值赋给变量
这意味着你可以在http上下文中定义map,但是这个值会在你访问nginx配置中
$myvar
的时候赋值。回到你的问题:因为NGINX变量总是全局的,所以每个
server
块有一个map
是没有意义的,因为它们无论如何都是全局的。vh0rcniy2#
我认为这真的是关于开发人员 * 构建 * 模块是什么和 * 它实际上是如何 *。
我看了看引擎盖下的源代码,我会建议相同的更清晰。我还使用了以下指南来理解代码的含义:https://www.evanmiller.org/nginx-modules-guide.html
ngx_http_map_module
的源代码是here。如果我看一下
static ngx_command_t ngx_http_map_commands[] = {...}
,它定义了模块的指令,特别是下面的代码段:字符串
1.第一个参数只定义指令字符串
1.第二个参数很有趣。
type
字段是:类型是一组标志,指示指令在何处法律的以及指令接受多少个参数。
我们在这里看到,定义的字段是
NGX_HTTP_MAIN_CONF
,这使得该指令在http级别有效。但是我们没有看到对应的标志NGX_HTTP_SRV_CONF
-(对于server
)或NGX_HTTP_LOC_CONF
(对于location
级别)。因此,
ngx_http_map_module
的这个特定实现只在http级别工作是有意义的。现在,它可以在服务器/位置级别上工作吗?从理论上讲,它应该。但它需要在源代码中做出一些贡献。如果你认为它会成为一个有用的功能,请做出贡献:)
ef1yzkbh3#
map
可以使用的范围在nginx源代码中是固定的。下面是ngx_http_map_module.c的部分代码。你可以看到map
只能在NGX_HTTP_MAIN_CONF
中使用,这意味着http
级别。字符串