Setting cache parameters via if directives

agentzh agentzh at gmail.com
Tue Feb 1 11:47:03 MSK 2011


On Fri, Jan 28, 2011 at 11:55 PM, Ryan Malayter <malayter at gmail.com> wrote:
> I do something similar using the conditinal setting of variables
> inside the if block to set Cache-Control values, perhaps you can use a
> similar method to set the values of proxy_cache_valid. Since setting
> variables is one of the few "safe" things to do inside an if block,
> and most directives can take variables as agurments, it is generally
> useful.
>
> location / {
>   set $mycc = "private, max-age=0";
>
>   if ($foo = "bar") {
>      set $mycc = "public, max-age=3600"
>      }
>
>  proxy_pass http://backend;
>  add_header Cache-Control $mycc;
> }
>

I'm amazed to see the config above works for you. I'm not sure if
you're using some ancient versions of nginx that I know very little
about (like 0.6.x or 0.5.x or even earlier).

Consider the following config snippet:

    location /test {
        set $a 3;
        if ($a = 3) {
            set $a 4;
        }
        echo $a;
    }

GET /test will give you nothing for nginx 0.7.21 ~ 0.9.4. Don't tell
me that the ngx_echo module's echo directive is buggy because it's too
dead simple to get wrong.

Basically for "modern" versions of nginx, the location "if" block
creates an anonymous nested location and will trap the execution flow,
that is, once you get in, you'll never go out of it to reach the
content phase. And that's one of the reasons why people call nginx's
"if" an evil monster ;)

Cheers,
-agentzh



More information about the nginx mailing list