Cachear archivos estáticos es la velocidad más barata que existe: el navegador ni siquiera pregunta. El riesgo es el contrario: una hoja de estilos cacheada un año que luego necesitas cambiar, en una máquina a la que no llegas.

La regla que hace segura una caché larga

Cachea de forma agresiva SOLO los archivos cuyo nombre cambia cuando cambia su contenido. Así un cambio es un nombre nuevo, la caché vieja deja de importar y ningún visitante se queda nunca con el archivo equivocado.

/css/site.a1b2c3.css        <- safe to cache for a year
/css/site.css?v=1788541047   <- the same idea, from the file mtime

Qué poner

location ~* \.(css|js|woff2|jpg|png|webp|svg)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
}

location ~* \.(html|php)$ {
    add_header Cache-Control "no-cache";
}

immutable le dice al navegador que ni siquiera revalide. no-cache en el HTML no significa «no cachear»: significa «pregúntame primero», que es justo lo que hace falta para una página cuyo contenido cambia sin que cambie su dirección.

Nunca caches mucho tiempo un archivo con nombre fijo. /css/site.css guardado un año son un año de visitantes con el diseño viejo, y no hay nada que puedas hacer desde tu lado para acortarlo.

Comprueba lo que estás enviando

curl -sI https://yourdomain.com/css/site.css | grep -iE "cache-control|expires|etag"

ETag y Last-Modified

Estos abaratan la COMPROBACIÓN en vez de hacer innecesaria la petición: el navegador pregunta, el servidor responde 304 Not Modified y no se manda cuerpo. Bien para el HTML, y para los recursos la segunda mejor opción tras no preguntar nada.

Detrás de una CDN, recuerda que hay dos cachés. Purgar la CDN no llega a un navegador que tiene el archivo para un año, y esa es la razón por la que el nombre tiene que cambiar.