11 votos

¿Cómo añado cabeceras no-cache a todas las páginas 404 servidas por apache y nginx?

Recientemente me he encontrado con un problema después de cambiar a Cloudflare, y la solución es básicamente detener Cloudflare de almacenamiento en caché de 404 respuestas.

En nuestra configuración multiservidor con equilibrio de carga, se producen ocasionalmente 404, pero se solucionan rápidamente mediante rsync (a través de lsyncd). Antes de Cloudflare, una nueva petición al archivo 404 se convertía rápidamente en 200 mientras rsync hacía su trabajo.

Sin embargo, como Cloudflare almacena en caché todos los datos basándose en el encabezado de caché, y ni apache ni nginx envían un encabezado no-cache para los 404, Cloudflare acaba almacenando en caché la respuesta 404 durante un tiempo.

He estado buscando una solución para añadir globalmente un encabezado de este tipo para 404s tanto en apache y nginx (a nivel mundial, para todos los dominios alojados), pero hasta ahora han llegado en blanco.

¿Alguien puede ayudar?

Gracias, señor.

7voto

rhavin Puntos 186

¿No es suficiente con utilizar una directiva error_page y, a continuación, gestionar la ubicación por separado con el encabezado añadido?

por ejemplo, en Nginx:

    server {
      ...
      error_page 404 /404.html;
      location = /404.html {
        root   /usr/share/nginx/html;
        add_header Cache-Control "no-cache" always;
      }
    }

7voto

Xavier Lucas Puntos 5349

También puedes hacerlo así :

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

server {

    [ ... ]

    add_header "Cache-Control" $cache_header always;

}

6voto

Clem Puntos 220

En apache 2.4, podrías intentar 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>

En always es importante porque este es un:

Está añadiendo una cabecera a una respuesta no satisfactoria (no-2xx) generada localmente, como una redirección, en cuyo caso sólo se utiliza la tabla correspondiente a always en la respuesta final.

Usted dijo que todos los 404s, pero para una referencia completa, por supuesto, podría tener sentido para envolver que en un <FilesMatch> o <LocationMatch> para limitar el alcance.

Creo que esta es una nueva capacidad en apache 2.4 como el uso de expr condicionales no está en la versión 2.2 de la documentación de mod_headers.

curl -I [foo] sin esta configuración:

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] prueba con esta configuración:

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

Fuentes:

http://httpd.apache.org/docs/current/mod/mod_headers.html

-1voto

Nick Puntos 268

Mis cinco centavos sobre el tema -

en nuestro proyecto PHP tenemos algunas páginas 404, así que decidí hacerlo a nivel PHP usando las funciones PHP header()

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X