Cache Control Header in NGINX

I am a DevOps Consultant. 3 years experience with Cloud technologies. 9 years total IT experience in the Linux, Networking and Data Visualization domains. Love listening to music and playing older PC games.
The Cache-Control header is a powerful tool that can be used to control how a browser caches a resource. Here are some real-world examples of how to use the Cache-Control header in a location block:
To set a maximum age for a resource, you can use the
max-agedirective. This directive specifies the number of seconds for which the resource can be cached. For example, to set a maximum age of one year for all image files, you can use the following location block:location ~* \.(jpg|jpeg|png|gif)$ { add_header Cache-Control "max-age=31536000"; }To prevent a resource from being cached, you can use the
no-cachedirective. This directive tells the browser to revalidate the resource with the server before using a cached version. For example, to prevent caching of all HTML files, you can use the following location block:location ~* \.html$ { add_header Cache-Control "no-cache"; }To allow a resource to be cached by intermediate proxies, you can use the
publicdirective. This directive tells the browser that the resource can be cached by any cache, even if it is not the end user's browser. For example, to allow caching of all CSS files by intermediate proxies, you can use the following location block:location ~* \.css$ { add_header Cache-Control "public"; }To prevent a resource from being modified, you can use the
immutabledirective. This directive tells the browser that the resource will never change, so it can be cached indefinitely. For example, to prevent modification of all JavaScript files, you can use the following location block:location ~* \.js$ { add_header Cache-Control "immutable"; }
Note that the Cache-Control header offers more control over caching behavior than the Expires header and takes precedence over the Expires header when both are present[6].
Related Headers
The Cache-Control header is a powerful tool that can be used to control how a browser caches a resource. However, there are other headers that can be used in conjunction with Cache-Control to provide more granular control over caching behavior. Here are some examples:
ETag: This header is used to provide a unique identifier for a resource. The browser can use this identifier to check if the resource has changed since it was last cached. You can use theetagdirective in a location block to set theETagheader. For example:location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico)$ { add_header Cache-Control "max-age=31536000"; etag on; }Vary: This header is used to specify which request headers should be taken into account when determining whether a cached resource can be used. You can use thevarydirective in a location block to set theVaryheader. For example:location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico)$ { add_header Cache-Control "max-age=31536000"; etag on; vary User-Agent; }This location block sets the
Varyheader toUser-Agentfor the same file types as the previous example.Last-Modified: This header is used to specify the date and time when a resource was last modified. The browser can use this information to check if the resource has changed since it was last cached. You can use thelast_modifieddirective in a location block to set theLast-Modifiedheader. For example:location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico)$ { add_header Cache-Control "max-age=31536000"; etag on; last_modified on; }
Note that the use of these headers depends on the specific requirements of your website and the behavior you want to achieve. In general, it is recommended to use the Cache-Control header as the primary caching control header and to avoid using the Expires header and the Pragma header[1].
Another location block
location ~* \.(css|js|jpg|png)$ {
access_log off;
add_header Cache-Control public;
add_header Pragma public;
add_header Vary Accept-Encoding;
expires 1M;
}
References
NGINX Fundamentals: High Performance Servers from Scratch | Udemy
https://www.imperva.com/learn/performance/cache-control/
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
https://www.keycdn.com/blog/cache-control-immutable
https://simonhearne.com/2022/caching-header-best-practices/
https://robotecture.com/http-topics/http-headers/http-header-expires/
https://simonhearne.com/2022/caching-header-best-practices/
https://robotecture.com/http-topics/http-headers/http-header-expires/
https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers
https://www.turing.com/blog/cache-control-headers-and-use-cases/
https://stackoverflow.com/questions/4480304/how-to-set-http-headers-for-cache-control
https://serverfault.com/questions/88523/should-i-use-expires-headers-cache-control-headers-or-both




