Como adiciono cabeçalhos sem cache a todas as páginas 404 servidas por apache e nginx?

6

Recentemente tive um problema depois de migrar para o Cloudflare, e a solução é basicamente impedir que o Cloudflare armazene em cache respostas 404.

Em nossa configuração multi-servidor com balanceamento de carga, ocorrem 404s ocasionais, mas eles são rapidamente corrigidos pelo rsync (via lsyncd). Antes do Cloudflare, uma re-solicitação para o arquivo 404ed se tornaria muito rapidamente 200, já que o rsync faz o seu trabalho.

No entanto, como o Cloudflare armazena em cache todos os dados com base no cabeçalho de armazenamento em cache, e nem o apache nem o nginx enviam um cabeçalho sem cache para os 404s, o Cloudflare acaba armazenando em cache a resposta 404 por algum tempo.

Eu tenho procurado por uma solução para adicionar globalmente esse cabeçalho para os 404s tanto no apache quanto no nginx (globalmente, para todos os domínios hospedados), mas até agora ficaram em branco.

Alguém pode ajudar?

Obrigado.

    
por Artem Russakovskii 07.05.2015 / 07:07

4 respostas

4

Você não consegue usar uma diretiva error_page e manipular o local separadamente com o cabeçalho adicionado?

por exemplo. em Nginx:

    server {
      ...
      error_page 404 /404.html;
      location = /404.html {
        root   /usr/share/nginx/html;
        add_header Cache-Control "no-cache" always;
      }
    }
    
por 07.05.2015 / 10:00
4

Você pode fazer isso também:

map $status $cache_header {
    default <for_other_codes>;
    404     "no-cache";
}


server {

    [ ... ]

    add_header "Cache-Control" $cache_header always;

}
    
por 07.05.2015 / 11:36
1

No apache 2.4, você pode tentar algo como:

FileETag None
<IfModule mod_headers.c>
    Header always unset ETag "expr=%{REQUEST_STATUS} == 404"
    Header always set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" "expr=%{REQUEST_STATUS} == 404"
    Header always set Pragma "no-cache" "expr=%{REQUEST_STATUS} == 404"
    Header always set Expires "Wed, 11 Jan 1984 05:00:00 GMT" "expr=%{REQUEST_STATUS} == 404"
</IfModule>

O always é importante porque é um:

You're adding a header to a locally generated non-success (non-2xx) response, such as a redirect, in which case only the table corresponding to always is used in the ultimate response.

Você disse todos os 404s, mas para referência completa, é claro que pode fazer sentido agrupar isso em <FilesMatch> ou <LocationMatch> para limitar o escopo.

Acredito que este é um novo recurso no apache 2.4, pois o uso de expr condicionais não é a versão 2.2 da documentação do mod_headers.

curl -I [foo] test sem essa configuração:

HTTP/1.1 404 Not Found
Date: Thu, 24 May 2018 17:44:29 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Type: text/html; charset=iso-8859-1

curl -I [foo] test com esta configuração:

HTTP/1.1 404 Not Found
Date: Thu, 24 May 2018 17:44:42 GMT
Server: Apache/2.4.18 (Ubuntu)
Cache-Control: max-age=0, no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Content-Type: text/html; charset=iso-8859-1

Fontes:

link

    
por 24.05.2018 / 20:19
0

meus cinco centavos no assunto -

no nosso projeto PHP nós temos poucas páginas 404, então eu decidi fazê-lo no nível PHP usando funções PHP header ()

    
por 22.05.2015 / 09:51