Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pb gestion cache browser + proxy

17 réponses
Avatar
Pascal PONCET
Bonjour à tous,

J'ai un souci récurrent, lorsque je modifie un script déclaré externe
(<script src="machintruc.js">), ses effets DHTML ne sont visibles
qu'après réactualisation de la page Web appelante. C'est la conséquence
indésirable et secondaire du caching côté client.

Or, cette réactualisation ne se fait, je crois, que de 2 façons : soit
volontairement par l'internaute (bouton "actualiser" ou "recharger"),
soit après réouverture du navigateur. Sans compter le cache du proxy FAI
qui, lui, n'est pas gérable.

J'ai bien envisagé la solution de passer le script par PHP (<script
src="machintruc.php">) en déclarant les headers adéquat pour inhiber les
caches, mais je perd définitivement l'avantage du caching dans ce cas.

Je cherche donc une solution intermédiaire.
Avez-vous quelque idée, ou pratique déjà utilisée en production ?

Merci,
Pascal

10 réponses

1 2
Avatar
SAM
Le 11/24/08 11:37 AM, Pascal PONCET a écrit :
Bonjour à tous,

J'ai un souci récurrent, lorsque je modifie un script déclaré externe
(<script src="machintruc.js">), ses effets DHTML ne sont visibles
qu'après réactualisation de la page Web appelante. C'est la conséquence
indésirable et secondaire du caching côté client.



Je cherche donc une solution intermédiaire.
Avez-vous quelque idée, ou pratique déjà utilisée en production ?



J'avais une adresse des diverses méthodes et des réaction des divers
brouteurs à ces méthodes ....
mais ... perdue (le site parait disparu)

essayer des trucs du genre :

function reloadJS_1() {
var s = document.getElementsByTagName('SCRIPT')[0];
s.src = s.src + '?'+encodeURI(new Date());
}

function reloadJS_2() {
var s = document.getElementsByTagName('SCRIPT')[0];
var s1 = s.cloneNode(true);
s1.src += '?'+Math.random();
s.parentNode.replaceChild(s1, s);
}

function reloadJS_3() {
var s = document.createElement('SCRIPT');
s.src = 'monboscript.js';
document.body.apendChild(s);
}


Sinon une lecture qui pourrait être intéressante :
<http://www.mnot.net/cache_docs/index.fr.html>

--
sm
Avatar
SAM
Le 11/24/08 3:58 PM, SAM a écrit :
Le 11/24/08 11:37 AM, Pascal PONCET a écrit :

Je cherche donc une solution intermédiaire.
Avez-vous quelque idée, ou pratique déjà utilisée en production ?





Je viens de retrouver ça dans mes oubiettes (qui a l'air de fonctionner
dans Fx et IE)

<html>
<script type="text/javascript">
function loadJS(file) {
var s = document.createElement('SCRIPT');
//s.type = 'text/javascript'; (ne plait pas à IE ?)
s.src = file;
document.body.appendChild(s);
}
</script>
<a href="#" onclick="loadJS('test.js'); return false;">
test du meme JS externe
</a>
</html>
Avatar
Pierre Goiffon
Pascal PONCET wrote:
J'ai un souci récurrent, lorsque je modifie un script déclaré externe
(<script src="machintruc.js">), ses effets DHTML ne sont visibles
qu'après réactualisation de la page Web appelante. C'est la conséquence
indésirable et secondaire du caching côté client.

Or, cette réactualisation ne se fait, je crois, que de 2 façons : soit
volontairement par l'internaute (bouton "actualiser" ou "recharger"),
soit après réouverture du navigateur. Sans compter le cache du proxy FAI
qui, lui, n'est pas gérable.

J'ai bien envisagé la solution de passer le script par PHP (<script
src="machintruc.php">) en déclarant les headers adéquat pour inhiber les
caches, mais je perd définitivement l'avantage du caching dans ce cas.

Je cherche donc une solution intermédiaire.



Pourriez-vous détailler, je ne comprend pas ce que vous décrivez ?

En attendant votre réponse, le document de référence pour moi sur le cache :
http://www.mnot.net/cache_docs/index.fr.html
Avatar
SAM
Le 11/24/08 5:20 PM, Pierre Goiffon a écrit :
Pascal PONCET wrote:
J'ai un souci récurrent, lorsque je modifie un script déclaré externe
(<script src="machintruc.js">), ses effets DHTML ne sont visibles
qu'après réactualisation de la page Web appelante. C'est la conséquence
indésirable et secondaire du caching côté client.

Or, cette réactualisation ne se fait, je crois, que de 2 façons : soit
volontairement par l'internaute (bouton "actualiser" ou "recharger"),
soit après réouverture du navigateur. Sans compter le cache du proxy FAI
qui, lui, n'est pas gérable.





Pour la page :
location.reload()
ou :
location = self.location;

<http://www.toutjavascript.com/reference/reference.php?iref>
<http://fr.selfhtml.org/javascript/objets/location.htm#reload>

J'ai bien envisagé la solution de passer le script par PHP (<script
src="machintruc.php">) en déclarant les headers adéquat pour inhiber les
caches, mais je perd définitivement l'avantage du caching dans ce cas.

Je cherche donc une solution intermédiaire.



Pourriez-vous détailler, je ne comprend pas ce que vous décrivez ?



Ben ... il a un JS externe et y veut ne "réactualiser" que ce script
sans "réactualiser" la page et ce malgré la page déjà en cache du
navigateur, paske le JS ne fait des gigotis sur la page qu'une fois.

Pourtant "une" fois doit être déjà une fois de trop, non ? ;-)

M'enfin ! yaka relancer la fonction des gigotis quoi !

Bon ... pit-être que le JS externe est d'abord bricolé côté serveur?
et qu'il faut le rappeler modifié suite à je ne sais quoi (ni comment
c'est transmis au serveur) ?
Ben ... non qu'y dit Pascal.

donc : relancer la fonction !
(et je ne vois pas ce que le cache peut bien empêcher ?)

En attendant votre réponse, le document de référence pour moi sur le
cache :
http://www.mnot.net/cache_docs/index.fr.html



Ce n'est pa ça que je viens de donner ?
(1h22 avant ton post)

--
sm
Avatar
Pascal PONCET
Pierre Goiffon a écrit :
Pourriez-vous détailler, je ne comprend pas ce que vous décrivez ?



Je reformule :

1. J'ai une page "index.php" qui, dans sa sortie Html, fait référence à
un script externe (<script src="myscript.js">).

2. Un mois plus tard, je modifie le script "myscript.js" avec des effets
visible (DHTML) sur la sortie Html de "index.php".

3. Certains internautes ne voient pas les effets de ces modifications,
car ils ont conservé en cache l'ancienne version de "myscript.js".


Comment éviter la mise en cache dans ce cas, tout en conservant le
bénéfice habituel du caching client ?
Autrement dit, comment forcer la revalidation du cache (+ proxy) pour un
script modifié ?

Voici les informations de cache que j'ai enregistrées deux fois de suite
sur ce script (en rechargeant la page "index.php") :
-------------------------------------------------
Last Modified Mon Nov 24 2008 18:56:21 GMT+0100
Last Fetched Mon Nov 24 2008 18:56:21 GMT+0100
Expires Tue Nov 25 2008 06:49:46 GMT+0100
-------------------------------------------------
Last Modified Mon Nov 24 2008 19:12:03 GMT+0100
Last Fetched Mon Nov 24 2008 19:12:03 GMT+0100
Expires Tue Nov 25 2008 07:07:02 GMT+0100
-------------------------------------------------

On voit bien que le cache positionne automatiquement une date
d'expiration au lendemain (en fait, environ 12h plus tard).
Donc, si je modifie mon script, je ne verrais ses effets que le
lendemain. D'où mon problème !
Avatar
SAM
Le 11/24/08 7:20 PM, Pascal PONCET a écrit :
Pierre Goiffon a écrit :
Pourriez-vous détailler, je ne comprend pas ce que vous décrivez ?



Je reformule :

1. J'ai une page "index.php" qui, dans sa sortie Html, fait référence à
un script externe (<script src="myscript.js">).

2. Un mois plus tard, je modifie le script "myscript.js" avec des effets
visible (DHTML) sur la sortie Html de "index.php".

3. Certains internautes ne voient pas les effets de ces modifications,
car ils ont conservé en cache l'ancienne version de "myscript.js".



et tu ne peux re-uploader 'index.php' ?

Comment éviter la mise en cache dans ce cas, tout en conservant le
bénéfice habituel du caching client ?
Autrement dit, comment forcer la revalidation du cache (+ proxy) pour un
script modifié ?

Voici les informations de cache que j'ai enregistrées deux fois de suite
sur ce script (en rechargeant la page "index.php") :



et c'est quel brouteur qui fait ça ?
(à moins que ne soient les en-têtes qui ne précisent cet "expire" ?)

-------------------------------------------------
Last Modified Mon Nov 24 2008 18:56:21 GMT+0100
Last Fetched Mon Nov 24 2008 18:56:21 GMT+0100
Expires Tue Nov 25 2008 06:49:46 GMT+0100
-------------------------------------------------
Last Modified Mon Nov 24 2008 19:12:03 GMT+0100
Last Fetched Mon Nov 24 2008 19:12:03 GMT+0100
Expires Tue Nov 25 2008 07:07:02 GMT+0100
-------------------------------------------------

On voit bien que le cache positionne automatiquement une date
d'expiration au lendemain (en fait, environ 12h plus tard).
Donc, si je modifie mon script, je ne verrais ses effets que le
lendemain. D'où mon problème !



Y avait qu'à le faire la veille ;-)

(ou de préciser au visiteur de ne passer que toutes les 13 heures)

Supprimer l'expiration ?
Normalement le brouteur ne recharge la page depuis le site que si elle a
changé depuis la dernière mise en cache.

--
sm
Avatar
Pascal PONCET
SAM a écrit :
essayer des trucs du genre :

function reloadJS_1() {
var s = document.getElementsByTagName('SCRIPT')[0];
s.src = s.src + '?'+encodeURI(new Date());
}



Après quelques recherches, je ne suis pas le seul à m'être posé cette
question :
http://www.lepotlatch.org/index.php/2008/10/31/146-recharger-le-cache-css-ou-js-a-chaque-mise-a-jour-des-fichiers

Ça ne m'était pas venu de suite à l'esprit, mais la solution la plus
simple est effectivement de rajouter un paramètre en GET dans l'appel au
fichier de script :

<script src="myscript.js?version=2.0"></script>

Il suffit de changer la valeur du paramètre pour que le cache demande
une revalidation.
En plus, j'ai trouvé une cohérence sympathique, je crois, en donnant au
paramètre le numéro de version du script !
(d'ailleurs, le script peut même récupérer cette valeur par
"location.search")

Je pense que ça pourra servir à d'autres galéreux... ;-)
Avatar
SAM
Le 11/25/08 10:06 AM, Pascal PONCET a écrit :
SAM a écrit :
essayer des trucs du genre :

function reloadJS_1() {
var s = document.getElementsByTagName('SCRIPT')[0];
s.src = s.src + '?'+encodeURI(new Date());
}



Ça ne m'était pas venu de suite à l'esprit, mais la solution la plus
simple est effectivement de rajouter un paramètre en GET dans l'appel au
fichier de script :

<script src="myscript.js?version=2.0"></script>

Il suffit de changer la valeur du paramètre pour que le cache demande
une revalidation.



C'est ce que fait la fonction de reload
(modification sans conséquence du src)

En plus, j'ai trouvé une cohérence sympathique, je crois, en donnant au
paramètre le numéro de version du script !
(d'ailleurs, le script peut même récupérer cette valeur par
"location.search")



Je ne comprends rien à ton truc !
Je croyais que la page était bloquée dans le cache pendant 12 heures ?
Que va-ce changer au problème d'avoir une légère variation de son code ?
C'est absolument identique à lui changer sa date de last-modified.
(ou, peut-être, de seulement celle du fichier JS).

Dans les 2 cas, en + de recharger le fichier JS, ça demande aussi de
recharger la page complète.

Je ne sais pas si lors du rafraichissement en cache d'un fichier html,
le navigateur rafraichit aussi tout ce qui y est embarqué (images,
scripts, etc.) ou seulement les éléments y modifiés (par leur seule date
de modification).

Dans le tutoriel de la mise en cache je n'ai pas bien compris si les
échanges navigateur/serveur permettent de rafraichir une page lorsque sa
date d'Expire n'est pas atteinte alors que son last-modified a changé.


--
sm
Avatar
Olivier Miakinen
Le 25/11/2008 10:50, SAM a écrit :

Ça ne m'était pas venu de suite à l'esprit, mais la solution la plus
simple est effectivement de rajouter un paramètre en GET dans l'appel au
fichier de script :

<script src="myscript.js?version=2.0"></script>



Je ne comprends rien à ton truc !
Je croyais que la page était bloquée dans le cache pendant 12 heures ?



Moi, ce que j'avais compris, c'était que la page HTML était bien
rechargée, mais pas le script myscript.js.

Que va-ce changer au problème d'avoir une légère variation de son code ?



L'URL du script étant différente, ni le navigateur ni un éventuel proxy
ne peut la retrouver dans le cache. C'est comme si son nom avait changé,
par exemple myscript-v2.js.

Je ne sais pas si lors du rafraichissement en cache d'un fichier html,
le navigateur rafraichit aussi tout ce qui y est embarqué (images,
scripts, etc.) ou seulement les éléments y modifiés (par leur seule date
de modification).



Non, c'est indépendant. La requête HTTP pour le fichier JavaScript est
indépendante de celle pour le fichier HTML.

Dans le tutoriel de la mise en cache je n'ai pas bien compris si les
échanges navigateur/serveur permettent de rafraichir une page lorsque sa
date d'Expire n'est pas atteinte alors que son last-modified a changé.



Je passe.
Avatar
Pascal PONCET
Olivier Miakinen a écrit :
Le 25/11/2008 10:50, SAM a écrit :
Ça ne m'était pas venu de suite à l'esprit, mais la solution la plus
simple est effectivement de rajouter un paramètre en GET dans l'appel au
fichier de script :

<script src="myscript.js?version=2.0"></script>


Je ne comprends rien à ton truc !
Je croyais que la page était bloquée dans le cache pendant 12 heures ?



Moi, ce que j'avais compris, c'était que la page HTML était bien
rechargée, mais pas le script myscript.js.




Exact !

Que va-ce changer au problème d'avoir une légère variation de son code ?



L'URL du script étant différente, ni le navigateur ni un éventuel proxy
ne peut la retrouver dans le cache. C'est comme si son nom avait changé,
par exemple myscript-v2.js.




Re-exact ! Et ça évite de changer le nom du fichier.

Je ne sais pas si lors du rafraichissement en cache d'un fichier html,
le navigateur rafraichit aussi tout ce qui y est embarqué (images,
scripts, etc.) ou seulement les éléments y modifiés (par leur seule date
de modification).



Non, c'est indépendant. La requête HTTP pour le fichier JavaScript est
indépendante de celle pour le fichier HTML.




Re-re-exact ! Et chaque navigateur a son mode de gestion, qui plus est
paramétrable, donc totalement imprévisible.

Dans le tutoriel de la mise en cache je n'ai pas bien compris si les
échanges navigateur/serveur permettent de rafraichir une page lorsque sa
date d'Expire n'est pas atteinte alors que son last-modified a changé.



Je passe.




Moi j'ai cru comprendre que non, tant que la date Expire n'est pas
passée, aucune revalidation du cache n'est demandée au serveur.
Au-delà, je passe aussi.

Merci à tous d'avoir passé un peu de temps.
Pascal
1 2