I thought that if I set the "Expires" and "Cache-Control:max-age" request headers, then a browser wouldn't make a GET request until after the max-age had passed?
O problema é o que ocorre depois que max-age expirar. Então você entra em um ciclo desagradável onde o navegador solicita o conteúdo toda vez que ele vê uma referência a ele - e toda vez que o servidor responde com um 304 não modificado. Alguns navegadores perguntarão cada vez que um arquivo aparecer na mesma página! A maioria do tempo gasto para uma solicitação é para as viagens de ida e volta para o handshake TCP e depois para os cabeçalhos HTTP - portanto, isso geralmente resultará em uma página ainda mais lenta porque você (quase) forneceu os detalhes do armazenamento em cache. O efeito é ainda pior em relação ao SSL, porque isso resulta em pelo menos uma viagem de ida e volta extra para o servidor e vice-versa.
A cláusula get out na especificação é que o servidor da Web pode responder a uma solicitação condicional, fornecendo ao arquivo original novas instruções de armazenamento em cache - mas, na prática, isso pode ser bastante difícil de fazer.
Se for o apache 2.0 ou posterior, você poderá resolver o problema removendo as partes condicionais da solicitação usando mod_headers (remova as linhas if-modified-since AND as if-none-match no cabeçalho da solicitação). Para o 1.3 ou anterior, você pode contorná-lo com uma tarefa do cron que toque os arquivos a cada N dias (em que N é um pouco menor que o tempo de cache padrão).
Also, I want to run this over HTTPS. Will using the same headers work for HTTPS too?
Suponho que o exemplo que você mostrou é não-SSL. Sim, este método funcionará para o não-ssl, mas preste atenção ao navegador keep-alive (o servidor da Web que não é da Microsoft ficará emaranhado tentando falar sobre uma conexão SSL com o Keep-alive, mas melhora bastante o desempenho) .
C.