quelques essais sur plateforme Windows :
* Mozilla 1.2
- en configurant le cache de maniere a ce que le navigateur
verifie a chaque demande si la page est toujours d'actualité
je me trouve avec le meme bug, la meme reponse 403.
- Mozilla envoie bien une requete avec le champ If-Modified-Since.
ce champ est detecté par SPIP qui analyse son cache et envoie sa
réponse.
* IE6 :
- Concernant IE6, je n'arrive pas a reproduire le bug. D'ailleurs
IE6 n'envoie pas le champ If-Modified-Since malgrés la configuration
du cache local. La gestion du cache de IE6 n'est pas aussi performante
et sans doute pas tout a fait conforme a ce qui devrait etre un standard.
Donc a chaque requete, IE6 ne transmettant pas le If-Modified-Since
se retrouve avec la page au complet, au lieu de faire la demande
"est-ce que la page est encore valide ?" et d'obtenir une reponse 403.
* anciennes versions de SPIP.
- les anciennes versions de SPIP contiennent "globalement" le meme code
pour la gestion du cache et des reponses http
- la différence s'il y en a une est particulierement ténue
* Apache
- j'ai du mal a mettre en cause Apache et sa configuration. Et pour cause
j'ai en production 2 SPIP sur le meme serveur, pratiquement dans la meme
arborescence et sur le meme compte Unix. Une version 1.6 qui fonctionn
parfaitement, et une version 1.7.0 qui ne m'a pas posé de soucis particulier
mais une 1.7.2 qui a ces problemes.
excusez-moi pour ceux qui ne sont pas concernés par ce probleme pour
mes messages un peu nombreux. Je tiens a faire avancer ce probleme
rapidement.
Voici un script php d'expérimentation pour les plus intéressés. Il s'agit
de gerer un pseudo cache et de generer a la SPIP des codes de retour 403
a la demande. Il est ensuite possible d'observer la requete soumise
par le navigateur.
L'ideal serait de disposer d'un formulaire pour modifier dynamiquement
le comportement, mais c'est un risque de ne pas etre en configuration
similaire au cas que nous avons sur SPIP. Ce script vaut ce qu'il vaut
a ne pas prendre pour argent comptant.
cat http_header.php
<?php
$cache_delay = 30; # 5 secondes
$log_msg = "";
$reload = $_REQUEST['reload'];
# $last_mod = time();
$last_mod = filemtime("http_header.php");
log_text("last_mod = $last_mod");
$response = 2;
switch ($response){
case 1:
http_header($last_mod, $last_mod + $cache_delay);
break;
case 2:
http_last_modified($last_mod, $last_mod + $cache_delay);
break;
case 3:
http_status(304);
exit(0);
break;
}
function http_header($last_mod, $expire){
@Header ("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_mod)." GMT");
@Header ("Expires: ".gmdate("D, d M Y H:i:s", $expire)." GMT");
}
# Tue, 01 Jun 2004 13:54:44
# Tue, 01 Jun 2004 12:59:36 GMT
# Tue, 01 Jun 2004 11:54:44 GMT
# Tue, 01 Jun 2004 12:59:36
function log_text($msg){
global $log_msg;
$log_msg .= $msg . "\n";
}
function log_print(){
global $log_msg;
echo "$log_msg";
}
function http_status($status) {
$status_string = array(
200 => '200 OK',
304 => '304 Not Modified',
401 => '401 Unauthorized',
403 => '403 Forbidden',
404 => '404 Not Found'
);
if ($php_cgi) Header("Status: $status");
else Header("HTTP/1.0 ".$status_string[$status]);
}
function http_last_modified($lastmodified, $expire = 0) {
$gmoddate = gmdate("D, d M Y H:i:s", $lastmodified);
log_text("http_last_modified() : gmoddate = $gmoddate");
if ($GLOBALS['HTTP_IF_MODIFIED_SINCE']) {
log_text("HTTP_IF_MODIFIED_SINCE");
$if_modified_since = ereg_replace(';.*$', '', $GLOBALS['HTTP_IF_MODIFIED_SINCE']);
$if_modified_since = trim(str_replace('GMT', '', $if_modified_since));
log_text("HTTP_IF_MODIFIED_SINCE = " . $GLOBALS['HTTP_IF_MODIFIED_SINCE']);
log_text("if_modified_since = $if_modified_since");
if ($if_modified_since == $gmoddate) {
log_text("if_modified_since = $if_modified_since");
http_status(304);
$headers_only = true;
}
}
@Header ("Last-Modified: ".$gmoddate." GMT");
log_text("http_last_modified() : gmoddate = $gmoddate");
if ($expire)
@Header ("Expires: ".gmdate("D, d M Y H:i:s", $expire)." GMT");
return $headers_only;
}
?>
Header - Last-modified test program
<br>
<li><a href="http_header.php?reload=false">reload</a>, <a href="http_header.php?reload=true">force reload</a>,
<li>time = <?php echo time() . " / " . gmdate("D, d M Y H:i:s", time()); ?>
<li>reload = <? echo $reload ?>
<pre>
<?php
print_r($_SERVER);
echo "\n\n------ log -----------\n";
log_print();
?>
</pre>