在nginx中有一个非常有用的指令map
.
但是只能在http
关卡中使用它(请参阅http://nginx.org/en/docs/http/ngx_http_map_module.html#map中的文档).
例如,我有一个已server
定义的,我想使用$url
变量在此服务器中使用一些条件重定向.在内部使用此指令会非常方便,server
但这是不可能的.为什么?
是的我也可以在http
关卡上进行,但是在关卡中可能会有不同server
的定义http
,我希望将这些条件保留在server
它们定义的部分中.
很老的帖子,但我真的想给黑暗带来一些光明。答案本身很简单。
NGINX 中的DR;TL变量始终是全局的,并且一旦定义就可以从配置中的任何地方访问。因此,在 aserver
或location
块中定义映射没有任何意义。
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)