1174 sujets

Accessibilité du Web

Bonjour,

voici le contenu de la bonne pratique Opquast n°184

a écrit :
Configurer le serveur Web pour qu'il puisse gérer la mise en cache des éléments statiques et gérer - au niveau applicatif - la possible mise en cache des éléments dynamiques.

En pratique, et en accord avec les spécifications HTTP le serveur devra envoyer les champs ETag , Date et Last-Modified correspondant respectivement à l'identifiant de la ressource, à la date de traitement de la requête et à la date de dernière modification de la ressource demandée. L'ensemble des dates étant au format GMT. Ces informations pouvant être complétées par les champs Content-Length et Expires si la taille en octets et la date d'expiration exacte du contenu sont connues.

Afin d'informer les proxys et les clients finaux sur le comportement à adopter vis à vis des contenus mis en cache, les auteurs devront utiliser les directives HTTP Cache-Control et Pragma en accord avec les délais de réactualisation nécessaires et le caractère privé de la diffusion.

La possible mise en cache pourra être ainsi finalisée par la soumission d'un message 304 Not Modified (sans la ressource demandée dans le corps de la requête) lorsque le serveur recevra un entête If-Modified-Since contenant une date antérieure à la date de modification de la dite ressource.


Si les images et les feuilles de style passent la validation http://www.ircache.net/cgi-bin/cacheability.py ... les pages .php ne sont pas validées et les ETags restent vides :

a écrit :

Expires
Cache-Control
Last-Modified
ETag
Content-Length - (actual size: 7966)
Server - Apache



Mais sur web-sniffer.net j'obtiens ceci :
a écrit :

HTTP Response Header
Name Value Delim
HTTP Status Code: HTTP/1.1 200 OK
Date: Wed, 07 Mar 2007 15:43:14 GMT CRLF
Server: Apache CRLF
X-Powered-By: PHP/4.4.4 CRLF
Vary: Host CRLF
Connection: close CRLF
Content-Type: text/html CRLF
Content-Encoding: gzip CRLF
Content-Length: 2981 CRLF


Est-ce que le site respecte la bonne pratique 184 ?

Si non, quand on loue un espace Web peut on respecter cette bonne pratique ? Comment ?

Merci Smiley smile
Modifié par Gunner4902 (09 Mar 2007 - 18:00)
Bonjour,
puisque cette bonne pratique dont je suis l'auteur vous pose problème, voici la solution technique que je mets généralement en place.

Vérifier que vous avez un moyen de rajouter du code PHP avant et après tout envoi de données par le serveur. Une solution consiste à ajouter ceci dans le fichier .htaccess à la racine du site:


php_value auto_prepend_file "inc/prepend.inc.php"
php_value auto_append_file "inc/append.inc.php"


Voici le contenu du fichier prepend.php (ou le code à ajouter dans votre propre fichier appelé avant tout envoi de données):


<?php
ob_start("PhpCache");

function PhpCache($buffer) {
	// Etag
	$etag = md5(preg_replace("/^\n*/", "", $buffer));
	header("ETag: " . $etag, TRUE);

	// Last-Modified
	$modified = gmdate("D, d M Y H:i:s \G\M\T");

	// Expires (une heure après)
	$expires = gmdate("D, d M Y H:i:s \G\M\T", time() + (60 * 60));

	// Vary
	if (!stristr($_SERVER["HTTP_USER_AGENT"], "msie")) {
		header("Vary: Accept-Encoding", TRUE);
	}

	// Content-Length
	$length = ob_get_length();

	// Cache-Control
	header("Cache-Control: public,must-revalidate", TRUE);

        // Réponse
	if (isset ($_SERVER["HTTP_IF_NONE_MATCH"]) && $_SERVER["HTTP_IF_NONE_MATCH"] == $etag && !isset ($_SERVER["HTTP_CACHE_CONTROL"])) {
		header("HTTP/1.1 304 Not Modified", TRUE, 304);
	}
	elseif (isset ($_SERVER["HTTP_IF_MODIFIED_SINCE"]) && $_SERVER["HTTP_IF_MODIFIED_SINCE"] < $expires && !isset ($_SERVER["HTTP_CACHE_CONTROL"])) {
		header("HTTP/1.1 304 Not Modified", TRUE, 304);
	} else {
		header("Last-Modified: " . $modified, TRUE);
		header("Expires: " . $expires, TRUE);
		header("Content-Length: " . $length, TRUE);
		return $buffer;
	}
}
?>


En gros, le Etag est calculé en fonction du contenu de la page donc si elle change d'une virgule (nouvelles données en base, changement du gabarit, etc), le Etag change.

On définit l'expiration une heure plus tard (à ajuster).

Si la page demandée comporte le même Etag que la version en cache ou si la date d'expiration n'est pas atteinte, le serveur renvoie un 304 et aucune donnée ne transite. La diminution de trafic peut atteindre 30%, ce qui n'est pas négligeable.

Pour le fichier append.php, on ajoute :


<?php
ob_end_flush();
?>


Et voila.
Modifié par Fabrice Bonny (09 Mar 2007 - 16:13)
Je te remercie d'avoir consacré ton premier post à cette réponse Smiley biggrin

Merci pour la réponse détaillée

Malheureusement celà engendre une erreur 500 : Internal Server Error Smiley decu

(hébergement en 60GP chez OVH) ... existe-t-il un moyen de contourner ce problème ?
Modifié par Gunner4902 (09 Mar 2007 - 18:22)
Sans doute est-ce du au .htaccess. Il faudrait faire un phpinfo pour vérifier si les fichiers prepend et append ne sont pas déjà prévus dans la configuration (ou regarder dans l'interface d'admin d'OVH si c'est déjà fourni). Ou alors tenter un php_admin_value à la place du php_value.