Tendo cutucado várias coisas, a resposta foi que eu tinha deixado de declarar um cabeçalho "Last modified" no php. Como a página muda diariamente, defino a data da última modificação para a meia-noite anterior. Agora está retornando 304s como esperado.