J'ai un site Web dont j'ai hérité l'entretien, qui est un gros désordre poilu.
L’une de mes tâches est d’améliorer les performances. Entre autres choses, j'ajoute des en-têtes Expires
aux images.
Maintenant, certaines images sont servies via un fichier PHP, et je remarque qu'elles ont l'en-tête Expires
, mais elles sont également chargées à chaque fois.
En regardant les en-têtes de réponse, je vois ceci:
Expires Wed, 15 Jun 2011 18:11:55 GMT
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma no-cache
Ce qui explique évidemment le problème.
Maintenant, j'ai regardé partout dans la base de code, et il ne dit pas "pragma" nulle part. .htaccess ne semble pas non plus avoir de relation.
Des idées sur ce qui pourrait définir ces en-têtes "pragma" (et "cache-control"), et comment puis-je l'éviter?
Créez un fichier simple qui ne contient aucune de vos bibliothèques PHP mais réside dans le même dossier que le fichier qui contient vos images via un fichier PHP.
file: test.php
Demandez ce fichier via un navigateur et vérifiez les en-têtes. Si vous voyez les en-têtes de réponse que vous ne voulez pas, vous savez qu'ils sont configurés via Apache et non générés via un fichier PHP et que vous pouvez concentrer vos recherches sur le fichier .htaccess dans l'arborescence, et sur le fichier http.confg et d'autres fichiers de configuration Apache inclus. Vous aurez envie de chercher
<Directory....
et
<VirtualHost
sections qui peuvent s'appliquer à votre site.
Si vous ne voyez pas les en-têtes dans une requête pour ce simple fichier PHP, vous savez que PHP définit les en-têtes quelque part. À la fin de votre fichier de service d’image (ou juste après l’écho de l’image et sa fermeture), mais le PHP extrait suivant
var_dump(get_included_files());
Demander une image via l'URL de diffusion des images. Le fragment ci-dessus imprimera tous les fichiers PHP utilisés dans la requête. (vous aurez probablement besoin de voir la source ou d'utiliser curl pour voir la sortie brute, car le navigateur signalera une image invalide)
Si vous avez un sous-ensemble de vos fichiers dans votre fichier de travail, recherchez-les pour les appels au
header();
une fonction. La fonction header
est le seul moyen (je pense) que le code brut PHP puisse définir les en-têtes de réponse. Vous aurez également envie de rechercher
call_user_func
eval
$$
au cas où il y aurait du code dynamique sur la page qui utilise les capacités de méta-programmation de PHP pour appeler la fonction header
.
Bonne chance!
Le coupable peut être php.ini, où session.cache_limiter = nocache. Définissez la valeur sur vide ou public pour éviter les en-têtes anti-cache.
J'ai eu un problème similaire avec Pragma: nocache
session_cache_limiter(false);
avant session_start();
a semblé la supprimer.
Essayez de désactiver les en-têtes dans .htaccess
. L'exemple ci-dessous les supprimera pour tous les fichiers correspondant aux extensions ico
, jpeg
, png
, gif
, js
, css
:
<FilesMatch "\.(ico|jpeg|png|gif|js|css)$">
Header unset Cache-Control
Header unset Pragma
</FilesMatch>
Vous pouvez trouver des indices dans cet article .
Je l'ai fait au moment de l'exécution avec ceci:
header("Pragma:");
qui a forcé le script à désactiver l'en-tête Pragma.
S'il ne se trouve pas dans .htaccess, il se peut que ce soit dans le fichier de configuration principal d'Apache ou dans l'un de ses fichiers inclus, en fonction de la configuration.
Il est intéressant de noter que, pour les personnes ayant des problèmes similaires, de nombreux frameworks ajoutent automatiquement des en-têtes, en particulier ceux qui sont en cache. Il est assez facile de les surcharger, que ce soit dans la bibliothèque du framework ou dans votre application.