Controlling Varnish cacheable content
Table of Contents
There are three ways to prevent content being cached in Varnish.
Add an explicit bypass in the Varnish configuration.
At the moment, only our support team can modify the Varnish configuration. You should supply your exception rules in a support ticket in a suitable REGEX format.
Send the appropriate no-cache
header in the response
You can do this yourself by setting a cookie in your application nocache=1
Add an Nginx header to define the element as being non-cacheable
You can edit the Nginx configuration (eg. ___general/example.com.conf
) (replace the domain as necessary) to add specific rules for content to be bypassed from being cached.
You can get very granular using regular expressions, and ultimately control exactly what does and doesn't get cached. The important command is just a single line, set $magestack_cacheable false;
- which you can use in any location.
Customising TTLs
You can also define specific cache TTLs for a given URI just be appending another header, suitable format is as per Varnish configuration syntax.
For stores running Magento 2, this variable will only take effect for semi-static or static content. It will have no effect on dynamic content, as Magento itself sets the lifetime.
set $magestack_cache_lifetime 5d;
Where the value follows uses the following syntax
[0-9]+[s|m|h|d|w] - seconds|minutes|hours|days|weeks
Examples
Enable Varnish for dynamic content
In ___general/example.com.conf
# Enable Varnish
set $magestack_cacheable true;
# Disable Varnish on specific URIs
if ($request_uri ~* "^/(index.php/)?(checkout|customer)") {
set $magestack_cacheable false;
}
Enable Varnish for static content
Static content is classed as any file defined here.
In ___general/example.com.static.conf
# Enable Varnish
set $magestack_cacheable true;
Enable Varnish for semi-static content
Semi static content is classed as any file ending in js|css
In ___general/example.com.semi-static.conf
# Enable Varnish
set $magestack_cacheable true;
Enable Varnish except for logged in WordPress users
In ___general/example.com.conf
# Enable Varnish
set $magestack_cacheable true;
# Disable Varnish for logged in WordPress admins
if ($http_cookie ~ "wordpress_logged_in_[a-fA-F0-9]+=admin") {
set $magestack_cacheable false;
}
Enable Varnish except for WordPress admin
In ___general/example.com.conf
# Enable Varnish
set $magestack_cacheable true;
# Disable Varnish for WordPress admin
location ~* ^/wp-(login|admin)|wp-*\.php$ {
set $magestack_cacheable false;
location ~* \.(php)$ {
set $magestack_cacheable false;
include fastcgi_params;
}
try_files $uri $uri/ index.php;
}
Disable Varnish for a real PHP file
Paths to real PHP files (rather than a virtual URL like /checkout
) must include the nested location for php
files, otherwise, Nginx will not interpret the file type properly and will cause the file to be downloaded rather than processed.
You should always nest the following location, inside of your new location, if it may match a real PHP file
location ~* \.(php)$ {
include fastcgi_params;
}
In ___general/example.com.conf
# Enable Varnish
set $magestack_cacheable true;
# Disable Varnish for real php file
location ~* ^/custom-script.php {
location ~* \.(php)$ {
set $magestack_cacheable false;
include fastcgi_params;
}
}
! Varnish cache is disabled by default for all content, it must be enabled at the top of your ___general/example.com.conf
before use.