Nginx | fastcgi_cache_valid dynamic based on request

Maxim Dounin mdounin at mdounin.ru
Fri Aug 26 15:36:23 UTC 2016


Hello!

On Fri, Aug 26, 2016 at 11:01:05AM -0400, c0nw0nk wrote:

> So I have been trying to make the fastcgi_cache_valid value based on user
> request.
> 
> if ($request_uri ~ "/url1" ) {
> set $cachetime "any 5s";
> }
> if ($request_uri ~ "/url2" ) {
> set $cachetime "any 5m";
> }
> 
> These did not work because it turns out your not allowed to have a dynamic
> variable within the fastcgi_cach_valid command.
> fastcgi_cache_valid $cachetime;

Exactly, the fastcgi_cache_valid doesn't support variables and 
that's why it won't work.

> So instead of the above i tried this instead.
> 
> if ($request_uri ~ "/url1" ) {
> set $cachetime "5";
> }
> if ($request_uri ~ "/url2" ) {
> set $cachetime "300";
> }
> add_header "X-Accel-Expires" $cachetime;
> 
> fastcgi_cache_valid any 60s;
> 
> But on url1 i get X-Cache: HIT when it should of expired after 5 seconds.

For X-Accel-Expires to work, it must be from an upstream server.  
That is, using add_header will work if done on your backend, but 
not in the nginx caching configuration.

> Is what i am trying to achieve even possible ? From my understand the
> X-Accel-Expires might just be for proxy_cache requests.

Use separate locations instead, i.e.:

    location /url1 {
        fastcgi_cache_valid any 5s;
        ...
    }

    location /url2 {
        fastcgi_cache_valid any 5m;
        ...
    }

Locations were specifically designed to make distinct URI-based 
configurations easy and efficient.

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



More information about the nginx mailing list