Na sua configuração, o Nginx é simplesmente um proxy reverso. Não está reescrevendo nada como você não disse para reescrever nada. É simplesmente armazenar páginas geradas pelo servidor upstream e entregá-las quando for solicitado.
O servidor upstream definiu o tempo de expiração, também há um controle de cache com uma duração máxima em segundos. Eu suspeito que o Nginx não leia essas diretivas e mantenha as coisas em seu cache contanto que você tenha dito, mas alguém pode me corrigir aqui.
Não acredito que exista uma maneira de o Nginx rastrear quando o servidor upstream enviou uma página e reescreveu os cabeçalhos da página antes de entregá-lo ao cliente. Isso teria que ser feito no servidor de aplicativos.
Expires é http / 1.0, o controle de cache é http / 1.1, de acordo com este artigo . Você pode usar qualquer um deles, mas eles entram em conflito, então acho que os navegadores atualizarão a página quando ela for informada.
IMHO, você precisa descobrir o que deseja e, em seguida, configurar seu servidor de aplicativos ou o Nginx para usá-lo. O Nginx pode reescrever cabeçalhos se você tiver o módulo headers_mod da sua distribuição ou compilado em . Se há um tempo que a página não deve ser armazenada em cache depois que eu sugiro que você use expira. Se você quer apenas que os navegadores tenham páginas razoavelmente novas, então o controle de cache é melhor, pois você pode definir coisas como o armazenamento em cache por servidores proxy e CDNs. Você sempre pode ter Expires especificar o tempo e o controle de cache especificar o comportamento do cache de CDN e proxy, incluindo a revalidação.
Sugira mais reflexão e pesquisa e você resolverá o resto sozinho. Referência útil sobre o controle de cache aqui .