Map is not matching correctly against upstream custom header

Maxim Dounin mdounin at mdounin.ru
Thu Jun 2 18:26:21 UTC 2016


Hello!

On Thu, Jun 02, 2016 at 07:51:06PM +0200, Gabriel Arrais wrote:

> Hi, I'm trying to configure my proxy cache settings based in a response
> custom
> header, using proxy_no_cache and proxy_cache_bypass directives.
> 
> First question: is it possible at all?
> Second question: If it is, why this map is always hitting the default
> value?
> 
>    map $sent_http_x_my_custom_header $no_cache {
>         default    0;
>         1          0;
>         true     0;
>         false      1;
>         "~*false"  1;
>     }
> 
>     ....
> 
>    location ~ ^/ {
>        ...
>        proxy_no_cache  $no_cache;^M
>        proxy_cache_bypass  $no_cache;^M
>    }
> 
> I've already tried the map with $sent_http_x_my_custom_header,
> $upstream_http_x_my_custom_header and $http_x_my_custom_header. It's
> always the same result.
> 
> obs: I've already tried with if but if is resolved in request time so it
> didn't work.

The problem is that you are trying to lookup response headers when 
there is no response yet.  Both "if" and "proxy_cache_bypass" are 
checked before the request is sent to a backend, and hence they 
can't do anything good.

Additionally, map{} results are always cached, and when you try to 
lookup it again via "proxy_no_cache" it just return a previously 
cached value (the one computed when there were no response yet).

Consider removing "proxy_cache_bypass" from your cofiguration.  
Just

    map $upstream_http_x_my_custom_header $no_cache {
        ...
    }

    proxy_no_cache $no_cache;

is expected to work fine.

-- 
Maxim Dounin
http://nginx.org/



More information about the nginx mailing list