Des maux de tête d'insomnie sur un simple cache javascript, alors que les en-têtes If-Modified-Since sont en place !

StackOverflow https://stackoverflow.com/questions/4987945

Question

Bonjour amis terriens !Depuis un certain temps, je fantasme sur des solutions possibles, mais je suis à court d'indices pour résoudre cet étrange problème.Laissez-moi vous décrire la raison, puis le problème :

Afin de combiner les fichiers javascripts pour réduire les requêtes http, je les ai mis en php, une solution simple, petite mais heureuse, qui sera mise en cache pendant six mois.(La vie serait-elle bien plus agréable si plus de choses fonctionnaient comme ça ?) Une solution de feu et d'oubli.Alors j'ai pensé...

Le site Web fonctionne bien et tout, sauf que lors de la visualisation des en-têtes du fichier js généré par php, il semble que ce showstopper soit apparu :

An If-Modified-Since conditional request returned the full content unchanged.

Qu'est-ce qui ne va pas ici dans le fichier combiné.js généré par php ?Toutes les réponses suggestives sont très appréciées !

fichier ci-dessous < allcombined.js >

<?php
header("Content-type: text/javascript; charset=UTF-8");
header("Expires: " . gmdate ("D, d M Y H:i:s", time() + 2419200) . " GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s", time() - 604800) . " GMT");

ob_start("compress");

include('script1.js');
include('script2.js');
include('script3.js');

ob_end_flush(); 
?>
Était-ce utile?

La solution

Pour gérer les en-têtes "If-Modified-Since", vous devez analyser cet en-tête et le comparer à votre dernière date de modification.Cela ne se fait pas automatiquement sauf si vous disposez d'un cache HTTP comme Varnish devant votre serveur Web.En PHP, si la date est satisfaisante, ne restituez pas de corps, mais renvoyez plutôt un 304 Not Modified réponse. Voici un bon exemple de cela. [php.net]

La raison pour laquelle vous recevez plus de demandes pour votre actif que prévu est parce que vous n'avez pas défini d'en-têtes Cache-Control ou Pragma.Vous voulez probablement faire :

header("Cache-Control: public, max-age=2419200");
header("Pragma: public");

Vous ne souhaiterez peut-être pas définir un âge maximum aussi long si vous souhaitez que le client s'enregistre pour les mises à jour de temps en temps...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top