Hi!
经过 map 模块决定的变量,是有缓存的,因为 nginx 认为 map 里的映射比较昂贵。
所以当你注释掉 limit_req 那条指令,那么第一次“取变量”发生在 log 阶段,
由于经过了 content 阶段的模块处理,$status 是有值的,所以你可以在 access_log 里得到正确的变量值。
而如果没有注释掉,则第一次“取变量”是发生在 limit_req 模块的钩子函数里(preacces 阶段),第一次取完后,$bb 的值就被缓存了,
log 阶段第二次取的时候,直接从缓存里得到了,并没有再次调用“取处理程序”,所以此时从日志里看到的值也没有符合你的预期。