PHP Contrôler le cache du navigateur

Bernard Senior

Membre confirmé
7 Janvier 2006
28
0
Bonjour à tous,

Je développe une appli web pour un intranet. Je n'ai pas trouvé la solution à un problème récurrent de cache HTTP du navigateur à l'aide de google, et pourtant, j'ai vraiment cherché... Il s'agit des méfaits potentiels du bouton "page précédente" du navigateur.

Je prends un exemple simple :

L'utilisateur est sur la fiche XXX (simple affichage sans saisie). Il clique sur le bouton "fiche suivante" (de mon appli s'entend, pas du navigateur). Il tombe sur la fiche YYY. S'il revient sur la fiche XXX en cliquant sur le bouton "page précédente" du navigateur, la page s'affiche sans problème. A partir de là, rien ne va plus : s'il clique sur le bouton "Modifier" c'est la fiche YYY qui va être présentée à la saisie. C'est normal car je garde le numéro de la fiche dans $_SESSION. Comme le navigateur a simplement resservi la fiche précédente présente dans son cache, les données de session n'ont pas été mises à jour.

J'ai trouvé sur internet un tas de demandes de programmeurs PHP pour neutraliser le bouton précédent du navigateur. La réponse est générale : ce n'est pas possible et en plus pas souhaitable. Conclusion : le programmeur doit se débrouiller pour prendre en compte le cas de l'utilisateur qui clique sur le bouton "page précédente". Bon !

J'ai essayé d'empêcher la mise en cache du navigateur par l'appel de la fonction PHP header en début de script :

Bloc de code:
header('Cache-Control: no-cache, must-revalidate');

Cela n'a pas l'air de changer grand chose.

Je pourrais aussi mettre mon numéro de fiche non plus en session mais plutôt dans un champ hidden sur la page. Le post la renvoie alors et le programme peut afficher la bonne fiche en modif. Dans le cas simple évoqué ci-dessus, cela peut marcher. Mais j'ai bien souvent beaucoup plus de données à conserver en session, dont des tableaux. Comment faire alors ? Et puis, l'utilisateur peut cliquer autant de fois qu'il le veut sur le bouton "page précédente" et là, je ne contrôle plus rien.

Si quelqu'un a des lumières sur la meilleure manière de contourner le problème, je suis preneur.

Je cherche une vraie solution logicielle et non pas simplement de signaler à l'attention de mes GU (gentils utilisateurs) d'être assez aimables et compréhensifs pour ne jamais cliquer sur le bouton "page précédente" du navigateur, mais seulement sur les boutons de navigation de l'application.

Merci d'avance.
 
À part un truc genre xulRunner pour encapsuler ton appli en supprimant les boutons du navigateur... mais c'est qu'une demie-solution :/
 
Il faut en effet que ton application gère ce problème.

Si j'ai bien compris, dans le cas de ton application, il faut que le bouton "Modifier" sache quelle fiche modifier. La solution du champ caché contenant le numéro de la fiche est donc tout à fait adaptée.
Je ne pense pas que cela t'empêche d'utiliser les sessions pour stocker des tableaux ou d'autres données structurées. Il faudrait donc sauvegarder les données de toutes les fiches visitées, et les resservir au GU en fonction du numéro de la fiche...
Pour moi la meilleure solution serait de repérer l'utilisation du bouton précédent, et de demander au GU de choisir une fiche si on remarque qu'il a cliqué sur précédent. Ainsi on évite toute incohérence dans les données, et toute torture cérébrale pour le programmeur.
Pour repérer l'utilisation du bouton précédent, tu peux comparer le numéro de fiche de la session avec celui passé en POST.
 
Merci à tous deux pour vos réponses.

En effet, Dr_cube, ta dernière solution me semble la meilleure.

Cependant, j'ai trouvé en fouillant sur Google et en recherchant précisément le titre que j'ai donné à ce post, des possibilités d'empêcher la mise en cache des pages. Dans le cas d'une application web dont les pages, par définition, ne sont jamais les mêmes, le blocage du cache n'est pas gênant. Il faut simplement ajouter dans l'en-tête HTML les metas suivantes :

Bloc de code:
<meta http-equiv="Expires" content="0">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">

Si on clique sur page précédente, le navigateur envoie un message pour soumettre à nouveau les données au serveur. Cela fonctionne très bien.

Encore merci à vous. Bon dimanche.
 
Dernière édition:
Si on clique sur page précédente, le navigateur envoie un message pour soumettre à nouveau les données au serveur. Cela fonctionne très bien.
Chez moi, ça ne marche pas si bien que ça. La première fois, j'ai bien le message. Mais pas la suite, je peux naviguer dans les différentes pages avec "Suivant" et "Précédent" sans plus être gêné, et ce sont toutes les pages enregistrées en cache qui sont visualisées, avec le contenu des formulaires tels qu'ils étaient quand ces pages ont été quittées.

Ces trois lignes sont souvent citées pour régler le présent problème. Mais ça ne marche pas à tous les coups. En l'occurrence, ça n'a pas l'air de marcher avec Safari 3.1.1 (je suis sous Tiger/PPC).
 
Ces trois lignes sont souvent citées pour régler le présent problème. Mais ça ne marche pas à tous les coups. En l'occurrence, ça n'a pas l'air de marcher avec Safari 3.1.1 (je suis sous Tiger/PPC).

Merci de me signaler le problème, je n'avais essayé que sous FireFox, que j'utilise à cause de Firebug (merveilleux outil de débogage Javascript et CSS).

Je confirme. On peut effectivement piéger Safari (je suis en version 3.1 également sous Tiger/PPC). :(

Bon ! Je n'ai plus qu'à me rabattre sur la solution du contrôle de la cohérence des numéros de fiche renvoyés par $_POST et $_SESSION. Décidément, rien n'est simple !

Merci encore pour votre aide.