Comment puis-je modifier l'en-tête Last-Modified sur nginx?

8

Mon serveur renvoie les en-têtes suivants:

Cache-Control:no-cache
Connection:keep-alive
Date:Thu, 07 Jul 2011 10:41:57 GMT
Expires:Thu, 01 Jan 1970 00:00:01 GMT
Last-Modified:Thu, 07 Jul 2011 08:06:32 GMT
Server:nginx/0.8.46`

Je souhaite que le contenu que je sers ne soit pas mis en cache, je cherche donc un moyen de renvoyer un en-tête Last-Modified qui contient la date et l'heure de début de la demande. Quelque chose comme maintenant () ...

evilpenguin
la source

Réponses:

10

"Je veux que le contenu que je sers ne soit pas mis en cache": vous pouvez désactiver If-Modified-Since vérification de l'en-tête de la demande avec la if_modified_since off;directive. if_modified_since doc

Et à propos de l'en- Last-Modifiedtête: vous pouvez le désactiver avecadd_header Last-Modified "";

Codeur occasionnel
la source
1
Vous ne pouvez pas désactiver les en-têtes avec add_header , vous pouvez uniquement les ajouter. De l'entrée: Notez qu'il ajoute juste une nouvelle entrée d'en-tête à la liste d'en-tête de sortie. Vous ne pouvez donc pas utiliser cette directive pour réécrire les en-têtes existants comme Server. Utilisez le module headers_more pour cela.
kolbyjack
Je l'ai vérifié avec curl -Det après avoir ajouté add_header Last-MOdified "";à mon nginx.conf, l'en- Last-Modifiedtête n'est plus là dans le fichier de vidage.
Casual Coder
1
Wow, en regardant la source, Cache-Control et Last-Modified sont des boîtiers spéciaux et seront définis au lieu d'avoir une entrée supplémentaire ajoutée. Il semble que le wiki doive être mis à jour.
kolbyjack
1
J'avais de nouveau tort, Cache-Control est un boîtier spécial, mais il ne remplace pas, il doit simplement être ajouté d'une manière spéciale. Seul Last-Modified définit l'en-tête au lieu d'en ajouter un nouveau.
kolbyjack
Bon à savoir, pourriez-vous me pointer vers un fichier? C'est dedans src/http/ngx_http_header_filter_module.c?
Casual Coder
6

Vous voudrez peut-être donner l'impression qu'un fichier est toujours modifié:

add_header Last-Modified $date_gmt;
if_modified_since off;
etag off;

En ce qui concerne la dernière ligne, si vous voulez vraiment masquer une vraie date de dernière modification, vous devez également masquer l'en- ETagtête car il y a des horodatages .

sanmai
la source
0

Honnêtement, j'ai passé une journée entière à ce sujet et je ne suis pas près de faire en sorte que Nginx fonctionne correctement, en particulier avec la façon dont Nginx formate incorrectement l'en-tête Last-Modified: Date qui n'est pas dans les RFC pour un en-tête Last-Modified.

J'ai cependant trouvé cette solution qui, si vous utilisez PHP, fonctionne très bien et peut être modifiée selon vos besoins. J'espère que cela aide. Il vous suffit de l'inclure tout en haut de vos pages .php avant le reste de votre code.

<?php
//get the last-modified-date of this very file
$lastModified=filemtime(__FILE__);
//get a unique hash of this file (etag)
$etagFile = md5_file(__FILE__);
//get the HTTP_IF_MODIFIED_SINCE header if set
$ifModifiedSince=(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false);
//get the HTTP_IF_NONE_MATCH header if set (etag: unique file hash)
$etagHeader=(isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false);

//set last-modified header
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $lastModified)." GMT");
//set etag-header
//header("Etag: $etagFile");
header("ETag: \"$etagFile\"");
//make sure caching is turned on
header('Cache-Control: private, must-revalidate, proxy-revalidate, max-age=3600');

//check if page has changed. If not, send 304 and exit
if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])==$lastModified || $etagHeader == $etagFile)
{
       header("HTTP/1.1 304 Not Modified");
       header("Vary: Accept-Encoding");
       exit;
}
?>

Testez ensuite votre site sur redbot.org et www.hscripts.com

MISE À JOUR:

  1. Ajout de l'envoi de l'en-tête varie avec la réponse 304 non modifiée (obligatoire)
  2. Cache modifié: la taille maximale de l'en-tête de contrôle peut être modifiée selon vos propres besoins.
  3. Pour donner du crédit là où elle est due, j'ai trouvé la solution ici et l'ai légèrement modifiée - https://css-tricks.com/snippets/php/intelligent-php-cache-control/
MitchellK
la source