contenu php jamais mis en cache par navigateur?

J’ai effectué des tests pour un site Web sur la manière dont le contenu dynamic (via PHP / nginx dans ce cas) est mis en cache par différents navigateurs.

Je suis arrivé à la conclusion que, par défaut, les fichiers php ne sont JAMAIS extraits du cache, même dans les navigateurs mobiles, même si dans la réponse il n’y a pas de paramètre Cache-Control ni Expires , même si je n’envoie pas de requêtes POST suivez simplement un lien vers la page. Ils sont toujours téléchargés. En revanche, les fichiers css / js / image sont extraits du cache.

C’est bon pour moi, car je veux que le HTML dynamic touche toujours le backend et dispose d’un mécanisme de mise en cache sous la forme de Varnish ou de ma propre implémentation php / filesystem.

Est-ce que ce comportement est généralement attendu par défaut? J’utilise des cookies de session en passant.

Tout d’abord: je ne suis pas un expert et il y a probablement plus de choses à append au sujet que je ne le ferais maintenant, mais cela devrait vous donner une compréhension de base de son fonctionnement.

CSS, les images et les fichiers Javascript sont (généralement) servis directement par le serveur Web sans toucher aucun script php. Par conséquent, le serveur Web gère lui-même la mise en cache pour ces fichiers.

Pour le contenu PHP, le serveur Web appelle votre script php et renvoie le code d’état 200 (s’il n’y a pas d’erreur ou s’il n’est pas explicitement spécifié différemment dans le script).

Maintenant, voyez ce lien: Tutoriel Caching

Là il dit:

Si aucun validateur (un en-tête ETag ou Last-Modified) n’est présent sur une réponse et qu’il ne contient aucune information de fraîcheur explicite, il sera généralement, mais pas toujours, considéré comme non corrigible.

Cela dit, le serveur Web n’appenda pas ces en-têtes aux réponses PHP. Mais il les appenda aux ressources statiques comme les images, css, js.

Donc, pour les futures demandes sur votre site Web, le navigateur sait (à cause de ces en-têtes) que le site lui-même n’est pas cachable, mais que l’image est.

Si vous demandez le site Web une deuxième fois, le client demande normalement le script php et obtient à nouveau la réponse normale, car aucune information de mise en cache n’est incluse dans la réponse d’origine (rien de spécial ici).

Maintenant, l’article ci-dessus dit:

Lorsqu’un cache comporte une représentation contenant un en-tête Last-Modified, il peut l’utiliser pour demander au serveur si la représentation a changé depuis la dernière fois, avec une demande If-Modified-Since.

Donc, fondamentalement, le navigateur demanderait au serveur Web si l’image a changé, et si ce n’est pas le cas, le serveur renverrait une réponse “304 non modifiée”, sans append l’image réelle à la réponse (<= ceci est cache).

Comme je l’ai déjà dit, un script php ne renvoie jamais ce code d’état s’il n’est pas défini explicitement. Donc, après avoir couvert les bases, nous pouvons arriver à la partie importante: 😉

tl; dr ou “Comment mettre en cache les pages PHP”

Vous devriez probablement lire la section “Écrire des scripts compatibles avec Cache” de l’article ci-dessus en premier.

Cependant, une solution serait:

  1. Inclure des informations de validation (par exemple, un en-tête “Last-Modified”) dans la réponse de votre script PHP (en utilisant la fonction header )
  2. Vérifiez, au début de votre script, l’en-tête “If-Modified-Since” et renvoyez le code d’état “304 Not Modified” si nécessaire (sans exécuter le rest du script).

Lorsque vous demandez de nouveau une ressource précédemment renvoyée sans en Cache-Control tête Expires ou Cache-Control , le navigateur est censé interroger à nouveau le serveur, quel que soit le type de contenu (après tout, les images, CSS, etc. peuvent être dynamicment généré aussi).

La seule différence est que les fichiers réellement statiques sont généralement servis avec des en Last-Modified têtes de réponse Last-Modified et / ou Etag , ce qui permet au navigateur de mettre en cache les données et de rendre les requêtes ultérieures conditionnelles (avec If-Modified-Since et / ou If-None-Match têtes de demande). Si le contenu est frais, le serveur renvoie une réponse 304 Not Modified sans contenu, et le navigateur le extrait du cache. Cela ne se produit pas avec la sortie de scripts dynamics (enfin, pas par défaut).