web-dev-qa-db-fra.com

Comment puis-je ajouter des en-têtes de cache sur les 404 pages desservies par Apache et Nginx?

J'ai récemment rencontré un problème après la commutation sur Cloudflare et que la solution consiste à arrêter essentiellement Cloudflare de la mise en cache 404 réponses.

Dans notre configuration multi-serveurs équilibrée de la charge, des 404s occasionnels se produisent, mais ils sont rapidement fixés par RSYNC (via LSYNCD). Avant Cloudflare, une demande à nouveau au fichier 404ED deviendrait très rapidement 200 que RSYNC fait son travail.

Toutefois, étant donné que Cloudflare cache toutes les données basées sur l'en-tête de mise en cache et ni Apache ni Nginx n'envoient un en-tête NO-cache pour 404s, Cloudflare finit par mettre en cache la réponse 404 pendant un moment.

Je cherche une solution à l'échelle mondiale, ajoutez une telle en-tête pour Apache et Nginx (à l'échelle mondiale, pour tous les domaines hébergés), mais jusqu'à présent, est arrivé en blanc.

Quelqu'un peut-il aider?

Merci.

9

Vous ne pouvez pas obtenir avec une directive ERROR_PAGE, puis gérer l'emplacement séparément avec l'en-tête ajouté?

E.g. dans nginx :

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

Vous pouvez le faire comme ça aussi:

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


server {

    [ ... ]

    add_header "Cache-Control" $cache_header always;

}
5
Xavier Lucas

À Apache 2.4, vous pouvez essayer quelque chose comme:

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>

Le always est important parce que c'est un:

Vous ajoutez une en-tête à une réponse non réussite (non-2xx) générée localement, telle qu'une redirection, auquel cas seul le tableau correspondant à toujours est utilisé dans la réponse ultime.

Vous avez dit tous les 404, mais pour une référence complète, bien sûr, cela pourrait être logique d'envelopper cela dans un <FilesMatch> ou <LocationMatch> Pour limiter la portée.

Je crois que ceci est une nouvelle capacité d'Apache 2.4 selon l'aide expr conditionnels n'est pas la version 2.2 de la documentation mod_headers.

curl -I [foo] Test sans cette configuration:

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] Testez avec cette configuration:

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

Sources:

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

3
cayleaf

mes cinq cents sur la question -

dans notre PHP, nous avons peu de 404 pages, alors je décide de le faire sur PHP niveau à l'aide PHP Header ( ) les fonctions

0
Nick