9

I've setup FastCGI cache like this:

location ~ \.php(/.*)?$ {
    fastcgi_cache RWI;
    fastcgi_cache_valid 200 60m;

    set $nocache 0;
    if ($request_method = POST)
    {
        set $nocache 1;
    }

    if ($http_cookie ~ (rwi_userid*|rwi_password*)) {
        set $nocache 1;
    }

    if ($request_uri ~* "/(vb/admincp/)") {
        set $nocache 1;
    }

    fastcgi_no_cache $nocache;
    fastcgi_cache_bypass $nocache;

    fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_pass "unix:/var/www/vhosts/system/{domain}/php-fpm.sock";
    include /etc/nginx/fastcgi.conf;
}

And on top of the server{} block I have:

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=RWI:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache $upstream_cache_status;

Problem is my PHP script (vBulletin) is always sending a Pragma & Cache-Control private. Is there any way to ignore those headers and force FastCGI to use cache when the above rules don't apply? I'm kind of lost in this caching possibility.

Dave M
  • 4,514
  • 22
  • 31
  • 30

1 Answers1

11

Nginx interprets a bunch of headers when used as a reverse proxy to honor HTTP intermediate caches specifications. This means the following headers, if present in your app replies, will change caching behaviour as explained :

  • The “X-Accel-Expires” header field sets caching time of a response in seconds. The zero value disables caching for a response. If the value starts with the @ prefix, it sets an absolute time in seconds since Epoch, up to which the response may be cached.

  • If the header does not include the “X-Accel-Expires” field, parameters of caching may be set in the header fields “Expires” or “Cache-Control”.

  • If the header includes the “Set-Cookie” field, such a response will not be cached.

  • If the header includes the “Vary” field with the special value “*”, such a response will not be cached (1.7.7). If the header includes the “Vary” field with another value, such a response will be cached taking into account the corresponding request header fields (1.7.7).

However, nginx ships with the fastcgi_ignore_headers directive in case you want to turn this off. So what you are looking for is : fastcgi_ignore_headers Cache-Control Pragma;.

Xavier Lucas
  • 13,095
  • 2
  • 44
  • 50
  • 1
    Actually I discovered you can't tell Nginx to ignore `Pragma` in that rule, because it results in a fatal error with the Nginx server. This is what you can use instead: `fastcgi_ignore_headers Cache-Control Expires Set-Cookie;` – Jesse Nickles Sep 06 '22 at 18:53