sent_http_HEADER Volatile under Nginx 1.2.4

Maxim Dounin mdounin at mdounin.ru
Fri Dec 13 16:31:41 UTC 2013


Hello!

On Thu, Dec 12, 2013 at 11:36:21PM +0000, Paul Taylor wrote:

> Hi Maxim,
> Thanks for your response. You’re right! Using the map did work 
> (I thought I’d tried that, but must have been tired!).
> So, now I have one other challenge, the value of $foo that you 
> define below is needed to identify whether to cache the response 
> of not. The only issue is that I have a number of other 
> directives that I also need to add into the mix - therefore I 
> use the set_by_lua code to nest/combine OR within an if 
> statement…code below (I’ve kept the variable name as foo, so 
> it’s clear which I’m referring to):
> map $upstream_http_x_no_cache $foo {
>   ""                    0;
>   default               1;
> }
> set_by_lua $bypass_cache '
>   local no_cache_dirs = tonumber(ngx.var.no_cache_dirs) or 0
>   local logged_in = tonumber(ngx.var.logged_in) or 0
>   local no_cache_header = tonumber(ngx.var.foo) or 0
>             
>   if((no_cache_dirs == 1) or (no_cache_header == 1) or 
>   (logged_in == 1)) then
>     return 1;
>   end
> 
>   return 0;
> ';
> Now when I make the Lua local variable declaration in order to 
> use it, the value of $upstream_http_x_no_cache is reset to 0, 
> even when it was set as 1 originally. If I comment out the line 
> declaring the local variable within the Lua call, it returns to 
> being a value of 1 again.
> Am I getting the sequencing of events wrong again? Is there any 
> way that I can get the value of $upstream_http_x_no_cache into 
> this Lua block, or would I need to do it another way?

Are you going to use the result in proxy_no_cache?  If yes, you 
can just use multiple variables there, something like this should 
work:

    proxy_no_cache $upstream_http_x_no_cache
                   $no_cache_dirs
                   $logged_in;

See here for details:

http://nginx.org/r/proxy_no_cache

> Thanks very much for your help so far Maxim.
> Paul
> __________________________________________________________________
> Hello!
> 
> On Thu, Dec 12, 2013 at 07:19:56PM +0000, Paul Taylor wrote:
> 
> > I’m in the process of making some amends to an environment, 
> > where my upstream servers are sending a custom header 
> > (X-No-Cache), which I need to detect and alter caching rules 
> > within the configuration.
> > 
> > The custom header is visible within the output, and I can 
> > re-output it as another header through configuration (i.e. 
> > add_header  X-Sent-No-Cache $sent_http_x_no_cache; ).
> > 
> > However, as soon as I perform any type of testing of this custom 
> > header, it disappears.
> > 
> > For example, if I was to perform a map on the custom header, try 
> > to set an Nginx variable to the value of the header, or test 
> > within an IF statement, any future call to this header is no 
> > longer possible. Additionally any setting or testing of the 
> > header fails.
> 
> Both "set" and "if" directives you mentioned are executed _before_ 
> a request is sent to upstream, and at this point there is no 
> X-No-Cache header in the response.  Due to this, using the 
> $sent_http_x_no_cache variable in "set" or "if" will result in an 
> empty value, and this value will be cached for later use.
> 
> It's not clear what you are trying to do so I can't advise any 
> further, but certainly using the $sent_http_x_no_cache variable in 
> "if" or "set" directives isn't going to work, and this is what 
> causes behaviour you see.
> 
> Just a map{} should work fine though - as long as you don't try to 
> call the map before the X-No-Cache header is actually available.  
> E.g., something like this should work fine:
> 
>     map $sent_http_x_no_cache $foo {
>         ""                    empty;
>         default               foo;
>     }
> 
>     add_header X-Foo $foo;
> 
> It might be also a goo idea to use $upstream_http_x_no_cache 
> variable instead, see here:
> 
> http://nginx.org/en/docs/http/ngx_http_upstream_module.html#variables
> 
> -- 
> Maxim Dounin
> http://nginx.org/
> 

> _______________________________________________
> nginx mailing list
> nginx at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx


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



More information about the nginx mailing list