Entêtes "cache" différentes de celles générées

Le
Dominique Ottello
Bonjour,

Je ne comprend pas pourquoi les entêtes (header) vues, sous Firefox, par
l'extension Live HTTP Headers ne reflètent pas celles qui sont générées
par les directives PHP header();

Par exemple, les entêtes de mon site http://aviatechno.free.fr sont
générées par le code PHP (Les calculs de temps ont été préalablement
vérifiés) :

header("content-type:text/html; charset=$charset");
header('Vary: Accept-Encoding');
header('Cache-Control: max-age%9200, must-revalidate');
header('Last-Modified: '.date('D, d M Y H:i:s',$modified).' GMT');
$offset = 60 * 60 * 24 * 5; //5 jours
header('Expires: '.gmdate('D, d M Y H:i:s', time() + $offset).' GMT');
ob_start("ob_gzhandler");
session_start();

et on voit, via LiveHTTPHeaders :

HTTP/1.1 200 OK
Date: Sun, 09 Oct 2011 09:27:04 GMT
Server: Apache/ProXad [Aug 9 2008 02:45:09]
Cache-Control: no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Content-Encoding: gzip
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Vary: Accept-Encoding
X-Powered-By: PHP/5.1.3RC4-dev
Set-Cookie: PHPSESSID…ad7ab8927784124fccb7e4fd2472ab; path=/
Last-Modified: Fri, 23 Sep 2011 00:00:00 GMT
Connection: close
Content-Type: text/html; charset=iso-8859-1

Le Last-Modified est bon, mais Expires devrait indiquer :
Fri, 14 Oct 2011 09:30:06 GMT

D'autre part, je n'envoie pas, pour Cache-Control : no-store, no-cache,
post-check=0, pre-check=0 ni Pragma: no-cache.

D'où cela vient-il ?

Que n'ai-je pas compris ?


--
Aujourd'hui, l'idéal du progrès est remplacé par l'idéal de l'innovation :
il ne s'agit pas que ce soit mieux, il s'agit seulement que ce soit nouveau,
même si c'est pire qu'avant et cela de toute évidence. Montherlant
Technologie aéronautique - http://ottello.net - Les anciens de Vilgénis
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Pascal Poncet
Le #23841671
Le 09/10/2011 11:33, Dominique Ottello a écrit :
Bonjour,



Bonjour,


Je ne comprend pas pourquoi les entêtes (header) vues, sous Firefox, par
l'extension Live HTTP Headers ne reflètent pas celles qui sont générées
par les directives PHP header();




Déjà le serveur qui fournit le fichier traité par PHP peut rajouter sa
sauce, avec des directives d'initialisation ou de htaccess.

Le Last-Modified est bon, mais Expires devrait indiquer :
Fri, 14 Oct 2011 09:30:06 GMT

D'autre part, je n'envoie pas, pour Cache-Control : no-store, no-cache,
post-check=0, pre-check=0 ni Pragma: no-cache.

D'où cela vient-il ?



Comme c'est là, ça sent le proxy à plein nez, à mon avis.
C'est le seul, sur le réseau, qui travaille sur la couche applicative et
capable de faire ces modifs.


--
Cordialement,
Pascal
Dominique Ottello
Le #23841801
Pascal Poncet
Comme c'est là, ça sent le proxy à plein nez, à mon avis.



A priori (À moins que ce soit à mon insu), je ne passe pas par un proxy.
Je vais voir du côté de chez Free.
SAM
Le #23841931
Le 09/10/11 16:32, Dominique Ottello a écrit :
Pascal Poncet
Comme c'est là, ça sent le proxy à plein nez, à mon avis.



A priori (À moins que ce soit à mon insu), je ne passe pas par un proxy.
Je vais voir du côté de chez Free.



chez Free ça n'a pas l'air de faire gd' chose


hop!

Date: Sun, 09 Oct 2011 14:38:53 GMT
Server: Apache/ProXad [Aug 5 2010 16:17:11]
Content-Location: info.php
TCN: choice
Vary: negotiate,accept
X-Powered-By: PHP/4.4.3-dev
Connection: close
Content-Type: text/html

200 OK


ou bien, si php 5, re-hop! :

Date: Sun, 09 Oct 2011 14:42:12 GMT
Server: Apache/ProXad [Aug 5 2010 16:17:11]
X-Powered-By: PHP/5.1.3RC4-dev
Connection: close
Content-Type: text/html

200 OK








--
Stéphane Moriaux avec/with iMac-intel
Olivier Miakinen
Le #23844591
Bonjour,

Le 09/10/2011 11:33, Dominique Ottello a écrit :

header('Last-Modified: '.date('D, d M Y H:i:s',$modified).' GMT');
$offset = 60 * 60 * 24 * 5; //5 jours
header('Expires: '.gmdate('D, d M Y H:i:s', time() + $offset).' GMT');

Expires: Thu, 19 Nov 1981 08:52:00 GMT
Last-Modified: Fri, 23 Sep 2011 00:00:00 GMT

Le Last-Modified est bon, mais Expires devrait indiquer :
Fri, 14 Oct 2011 09:30:06 GMT



Quelques questions pour avancer :

- que valent $modified et time() ?
- qu'est-ce qui change si tu mets time() au lieu de $modified dans
l'entête Last-Modified ?
- qu'est-ce qui change si tu mets $modified au lieu de time() dans
l'entête Expires ?
- qu'est-ce qui change si tu mets gmdate() au lieu de date() dans
l'entête Last-Modified ?
- qu'est-ce qui change si tu mets date() au lieu de gmdate() dans
l'entête Expires ?

Tu peux aussi essayer de rajouter des entêtes de test :

header('XDateModified: '.date('D, d M Y H:i:s',$modified).' GMT');
header('XGmdateModified: '.gmdate('D, d M Y H:i:s',$modified).' GMT');
$offset = 60 * 60 * 24 * 5; //5 jours
header('XDateTime: '.date('D, d M Y H:i:s', time()).' GMT');
header('XGmdateTime: '.gmdate('D, d M Y H:i:s', time()).' GMT');
header('XDateTimeOffset: '.
date('D, d M Y H:i:s', time() + $offset).' GMT');
header('XGmdateTimeOffset: '.
gmdate('D, d M Y H:i:s', time() + $offset).' GMT');
Dominique Ottello
Le #23846211
Olivier Miakinen
Tu peux aussi essayer de rajouter des entêtes de test :


Les entêtes de test passent toutes très bien tant en local qu'en réel
chez Free :

HTTP/1.1 200 OK
Date: Mon, 10 Oct 2011 15:10:34 GMT
Server: Apache/ProXad [Aug 9 2008 02:45:09]
Cache-Control: no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Content-Encoding: gzip
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Vary: Accept-Encoding
X-Powered-By: PHP/5.1.3RC4-dev
XDateModified: Fri, 23 Sep 2011 00:00:00 GMT
XDateTime: Mon, 10 Oct 2011 17:10:34 GMT
XDateTimeOffset: Sat, 15 Oct 2011 17:10:34 GMT
XGmdateModified: Thu, 22 Sep 2011 22:00:00 GMT
XGmdateTime: Mon, 10 Oct 2011 15:10:34 GMT
XGmdateTimeOffset: Sat, 15 Oct 2011 15:10:34 GMT
Set-Cookie: PHPSESSID¯b6496a5bfdf546e4978379293f8560; path=/
Last-Modified: Fri, 23 Sep 2011 00:00:00 GMT
Connection: close
Content-Type: text/html; charset=iso-8859-1

Ce qui m'intrigue fortement c'est cette entête Expires :

Expires: Thu, 19 Nov 1981 08:52:00 GMT

TOUJOURS exactement la même, en local, chez Free et chez 1and1.

J'ai comme l'impression qu'il me manque une ou plusieurs instruction(s)
PHP avant d'envoyer certains header pour qu'ils soient pris en compte
parce que, comme je l'ai écrit ci-dessus, le problème est le même en
local, ce que je n'avais pas regardé avant.


--
Il vaut mieux ignorer où l'on est, et savoir qu'on l'ignore, que de se
croire avec confiance où l'on n'est pas. Jean Dominique Cassini.
Technologie aéronautique - http://ottello.net - Les anciens de Vilgénis
Olivier Miakinen
Le #23846601
Le 10/10/2011 17:17, Dominique Ottello a écrit :

Tu peux aussi essayer de rajouter des entêtes de test :


Les entêtes de test passent toutes très bien tant en local qu'en réel
chez Free :

[...]
XDateModified: Fri, 23 Sep 2011 00:00:00 GMT
XDateTime: Mon, 10 Oct 2011 17:10:34 GMT
XDateTimeOffset: Sat, 15 Oct 2011 17:10:34 GMT
XGmdateModified: Thu, 22 Sep 2011 22:00:00 GMT
XGmdateTime: Mon, 10 Oct 2011 15:10:34 GMT
XGmdateTimeOffset: Sat, 15 Oct 2011 15:10:34 GMT
[...]



Ainsi donc, les fonctions time() et gmdate() sont hors de cause.
Et probablement aussi la fonction header().

Ce qui m'intrigue fortement c'est cette entête Expires :

Expires: Thu, 19 Nov 1981 08:52:00 GMT

TOUJOURS exactement la même, en local, chez Free et chez 1and1.



Cela tend à confirmer que la fonction header() est hors de cause. Mais
vu que c'est la même chose sur trois serveurs, j'aurais tendance à
soupçonner comme Pascal des directives d'initialisation ou des fichiers
.htaccess . Est-ce que tu as la même chose avec des fichiers statiques ?
Et si tu mets un fichier à la racine du site, c'est toujours le cas ?

Note : je ne peux pas tester sur ton site directement, je passe derrière
un proxy filtrant qui me l'interdit.

J'ai comme l'impression qu'il me manque une ou plusieurs instruction(s)
PHP avant d'envoyer certains header pour qu'ils soient pris en compte
parce que, comme je l'ai écrit ci-dessus, le problème est le même en
local, ce que je n'avais pas regardé avant.



Je peux me tromper, mais je suspecte que ton code PHP est complètement
étranger au problème.

Cordialement,
--
Olivier Miakinen
Pascal Poncet
Le #23846591
Le 09/10/2011 16:32, Dominique Ottello a écrit :
A priori (À moins que ce soit à mon insu), je ne passe pas par un proxy.



Et tu sembles avoir testé en local avec le même résultat, si j'ai bien
suivi.

Je ne suis pas très à l'aise avec les paramétrages de cache un peu
complexes, mais n'y a-t-il pas une contradiction, ou un chevauchement
possible, entre ces deux directives :

- "Cache-Control: ...max-age= <3 jours>..."
- "Expires: <J + 5 jours>..."

Chez moi en local, avec l'extension Firebug, je vois une différence
entre la réponse du serveur et la lecture du cache, lorsque j'envoie des
paramètres identiques aux tiens.

Réponse HTTP :

- Cache-Control: max-age%9200, must-revalidate
- Expires: Sat, 15 Oct 2011 16:11:38 GMT

Lecture cache :

- Expires Thu Oct 13 2011 18:11:38 GMT+0200 (CEST)

Bon, je ne sais si c'est une bonne piste, mais en plus je ne vois pas
trop l'intérêt, pour servir des pages dynamiques.
Peux-tu nous éclairer ?


--
Cordialement,
Pascal
Olivier Miakinen
Le #23846691
Le 10/10/2011 18:18, Pascal Poncet a écrit :

Je ne suis pas très à l'aise avec les paramétrages de cache un peu
complexes, mais n'y a-t-il pas une contradiction, ou un chevauchement
possible, entre ces deux directives :

- "Cache-Control: ...max-age= <3 jours>..."
- "Expires: <J + 5 jours>..."



Ah oui, je l'avais lu mais sans percuter (je cherchais juste à vérifier
le format de la date) :

14.21 Expires

...

Note: if a response includes a Cache-Control field with the max-
age directive (see section 14.9.3), that directive overrides the
Expires field.
</>
Dominique Ottello
Le #23847101
Olivier Miakinen
Cela tend à confirmer que la fonction header() est hors de cause. Mais
vu que c'est la même chose sur trois serveurs, j'aurais tendance à
soupçonner comme Pascal des directives d'initialisation ou des fichiers
.htaccess .



Maintenant (enfin) les entêtes correspondent à ce que j'envoie, et ce
sur les trois serveurs :

HTTP/1.1 200 OK
Date: Mon, 10 Oct 2011 17:54:05 GMT
Server: Apache/ProXad [Aug 9 2008 02:45:09]
Cache-Control: max-ageC2000, must-revalidate
Content-Encoding: gzip
Expires: Sat, 15 Oct 2011 17:54:04 GMT
Vary: Accept-Encoding
X-Powered-By: PHP/5.1.3RC4-dev
Set-Cookie: PHPSESSID“01ee036d4439645dbc5f0fb25fae49; path=/
Last-Modified: Fri, 23 Sep 2011 00:00:00 GMT
Connection: close
Content-Type: text/html; charset=iso-8859-1

Pour ce faire, il faut INTERDIRE à PHP de remplacer les entêtes du
client par les entêtes par défaut. Donc, avant d'envoyer les header :

session_cache_limiter( FALSE );

--
Aujourd'hui, l'idéal du progrès est remplacé par l'idéal de l'innovation :
il ne s'agit pas que ce soit mieux, il s'agit seulement que ce soit nouveau,
même si c'est pire qu'avant et cela de toute évidence. Montherlant
Technologie aéronautique - http://ottello.net - Les anciens de Vilgénis
Publicité
Poster une réponse
Anonyme