using $upstream* variables inside map directive

Ruslan Ermilov ru at
Wed May 7 12:44:24 UTC 2014

On Wed, May 07, 2014 at 01:38:04AM -0400, Kirill K. wrote:
> Hello,
> I'm trying to avoid caching of small responses from upstreams using map:
> map $upstream_http_content_length $dontcache {
> default 0;
> ~^\d\d$ 1;
> ~^\d$ 1;
> }
> Unfortunatelly, nginx seems to ignore $upstream* variables at the map
> processing stage, hence variables like $upstream_http_content_length or
> $upstream_response_length stay empty when map directive is processed (this
> can be observed in debug log as "http map started" message). In case I use
> non-upstream related variables, a map works as expected.
> Question: is there any way to use $upstream* vars inside the map directive,
> or maybe someone can offer alternative way to detect small upstream response
> in order to bypass cache?

If you use $dontcache with proxy_cache_bypass, then it's expected
behavior.  At the time proxy_cache_bypass is evaluated, there's no
response yet, so the $upstream_http_* do not exist.

If you try to use $dontcache with proxy_no_cache ONLY, it'll work,
because the latter is evaluated _after_ obtaining a response.

If you use it both with proxy_cache_bypass and proxy_no_cache,
please realize that using it with proxy_cache_bypass makes no
sense, and then the fact that "map" creates the so-called
cacheable variables plays its role.

I have a patch for "map" that makes map variables "volatile".
If you absolutely need such a "map" behavior, I can send it
to you for testing, but better limit the use of $upstream_http_*
to only proxy_no_cache.

More information about the nginx mailing list