O valor max-age especifica um número de segundos para o qual o objeto deve ser registrado como novo. Ou seja, ele poderá ser armazenado em cache, incluindo por navegadores por tantos segundos, então você pode realmente não precisar fazer nada para Cache-Control: max-age se habilitar esse caching como seu objetivo. Mais uma preocupação é o seu cabeçalho Pragma: no-cache. Também no seu cabeçalho Cache-Control, você especifica deve-revalidar. Isso significa que os clientes ainda precisarão fazer uma solicitação, mas a solicitação incluirá um cabeçalho If-Modified-Since, e o servidor poderá enviar uma resposta 304 e não precisar enviar novamente o conteúdo. Você deve considerar se esse é o comportamento que você realmente quer.
Aqui está uma explicação decente dos vários cabeçalhos de armazenamento em cache [ link , ou você pode ir para o RFC para a palavra autoritativa, em linguagem mais formal [ link
Geralmente não há necessidade de "atualizar" o valor max-age, a menos que você saiba antecipadamente quando a próxima versão do conteúdo será gerada no servidor, e usar um valor fixo para CC: max-age é muito menos intensivo para gerar o cabeçalho do que fazer cálculos de data todas as vezes.
O cabeçalho Cache-Control tem precedência sobre o cabeçalho Expires para clientes que entendem Cache-Control (que é a maioria deles, mesmo aqueles que afirmam ser HTTP / 1.0).
Se o seu cabeçalho "Expires" estiver sendo gerado corretamente e o valor de "max-age" não for o desejado, a solução mais fácil será suprimir CC: max age
em vez de corrigi-lo. ( link )