ETag in nginx - Simple Resource Caching
An ETag (Entity Tag) is an HTTP response header that identifies a version of a resource. This allow efficient caching by providing the client a method to check for a new version before downloading.
In general, the ETag is based on the file’s last modification time and size and usually handled by the reverse-proxy. This is called the weak ETag/ weak validation.
Alternative, there is a strong or content-based Etag that hashes the resources and provides a new version with every change. In most cases, the application has to manage the Etag.
Weak ETag headers can have the prefix W/ - this is optional and often only displayed with the initial 200 HTTP response and not the 304 HTTP response.

More information in the RFC9110 8.8.1 - Weak versus Strong.
Enabling ETag in nginx #
Enabling (weak) ETags in nginx is simple - add the following config to the http, server or location block to enable ETag headers.
[...]
etag on;
add_header Cache-Control "no-cache" always;
[...]
The config can be overwritten in a more specific block, in case you want to change the caching for images or other resources.
Check syntax with sudo nginx -t and reload the nginx config.
That is it.
Testing it with curl #
In this article we are going to do some testing with curl. The ETag header can be seen in the browser dev tools as well.
curl -I https://ittavern.com
HTTP/2 200
server: nginx
date: Mon, 20 Oct 2025 15:42:14 GMT
content-type: text/html
content-length: 20665
last-modified: Sat, 18 Oct 2025 20:55:34 GMT
vary: Accept-Encoding
etag: "68f3fec6-50b9"
[...]
This ETag won't change as long as the size (content-length) or time of last modification (last-modified) of the resources changes.
We now can check the resource again with the ETag to check for changes.
curl -H 'If-None-Match: "68f3fec6-50b9"' -I https://ittavern.com
HTTP/2 304
server: nginx
date: Mon, 20 Oct 2025 16:24:47 GMT
last-modified: Sat, 18 Oct 2025 20:55:34 GMT
etag: "68f3fec6-50b9"
[...]
The 304 HTTP code stands for Not Modified.
This is how it looks in the browser
