Aller au contenu

htaccess et compression gzip


Sujets conseillés

Salut,

Le module de compression Apache n'étant pas activé chez certains hébergeurs, j'utilise couramment un fichier htaccess, qui redirige les requète vers une page php qui les compresse avec ob_gzhandler (ce qui marche bien).

Mais j'ai remarqué un truc en faisant des tests :

quand je fais une requète sur lesitequejeveux/index.html, la page est bien gzippée

quand je fais la même requète sur lesitequejeveux/, ça me renvoie bien la même page, mais elle n'est pas gzippée

Donc, je suppose que le fait que la directive directoryindex renvoie sur la page A n'est pas considérée de la même façon que la requète directe à la page A. Si quelqu'un pouvait m'expliquer mon erreur, et la façon de la corriger, ce serait sympa.

Merci

Mon .htaccess pour les pages html

RewriteRule (.*)\.html compress.php?file=$1\.html [L]

Lien vers le commentaire
Partager sur d’autres sites

RewriteRule (.*)\.html compress.php?file=$1\.html [L]

Cette ligne est correcte, mais vu que dans l'adresse lesitequejeveux/ il n'y a pas de ".html" la règle n'est pas appliquée

En fait apache redirige directement lesitequejeveux/ vers lesitequejeveux/index.html ou lesitequejeveux/index.php mais ne réapplique pas les règles

Tu peux peut être enlever les redirections automatiques d'apache et tu les écrit explicitement

par exemple:

RewriteRule lesitequejeveux/ lesitequejeveux/index.html

?

Lien vers le commentaire
Partager sur d’autres sites

Hello,

je m'écarte du sujet, mais en compressant les pages de cette manière tu fais souvent plus de dégats qu'autre chose à mon avis :

*) déjà j'ose espérer que tu utilises readfile() pour le lire le fichier statique, ce qui devrait au moins limiter les dégats coté gestion mémoire.

*) ob_start( 'gz_handler' ) stocke tout le contenu en mémoire, et envoi la version compressée du fichier qu'à la fin du traitement. Cela induit un léger lag pour l'utilisateur (=> impression de lenteur), en plus du surplus de consommation mémoire. Préférer un ini_set( 'zlib.output_compression' ) qui n'a aucun de ces deux effets négatifs ; en contre partie la page sera légèrement moins bien compressée, vu qu'il travaillera par petit tronçon (de 4Ko je crois).

*) et quid des entêtes HTTP pour gérer le cache du navigateur ? Prends tu la peine de gérer ces entêtes correctement (au moins le "last-modified"), ou bien forces tu les navigateurs à re-télécharger ces pages systématiquement ?

*) rediriger un fichier statique vers PHP peut induire une forte surcharge pour un serveur en fastcgi (souvent le cas chez les hébergeurs).

Même si le but est louable (améliorer la qualité de navigation des visiteurs), j'ai bien peur que l'effet final soit inverse.

Le mieux serait certainement de demander ce module à l'hébergeur non ?

(désolé pour le HS...)

Lien vers le commentaire
Partager sur d’autres sites

Salut Kioob,

Pour la méthode utilisée, la voici :

		case "html" :
ob_start("ob_gzhandler");
header("Content-type: text/html; charset: ISO-8859-1");
header("Cache-Control: must-revalidate");
$offset = 7 * 24 * 60 * 60;
$ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
echo (file_get_contents ($file));
break;

Pour le zlib.output_compression, je vais voir si c'est dispo.

Pour les en-têtes http, comme tu vois, je me préoccupe essentiellement du "expires".

Je suis preneur de tout conseil dans le but d'améliorer la vitesse de chargement des pages, la gestion du cache, etc.

Lien vers le commentaire
Partager sur d’autres sites

Hello,

l'entête "expires" était déjà une bonne chose oui.

Après quelques retouches pour limiter la latence et la conso mémoire, ça donnerait ça :

header('Content-type: text/html; charset: ISO-8859-1');
header('Cache-Control: must-revalidate');

/**
* Active la compression interne de PHP.
*/
ini_set( 'zlib.output_compression', true );

$lastModified = filemtime( $file );
header('Last-Modified: '. gmdate('D, d M Y H:i:s', $lastModified) . ' GMT' );
$offset = 7 * 24 * 60 * 60;
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $offset) . ' GMT' );

$etag = 'x-'.dechex($lastModified).'-'.dechex(filesize($file));
header('ETag: "'.$etag.'"' );

$modified = true;
if( isset( $_SERVER[ 'HTTP_IF_MODIFIED_SINCE' ] ) )
{
$last_load = @ strtotime( substr( $_SERVER[ 'HTTP_IF_MODIFIED_SINCE' ], 0, 29 ) );
if( $last_load >= $lastModified )
$modified = false;
}
if( ( $modified === false ) or ( isset( $_SERVER[ 'HTTP_IF_NONE_MATCH' ] ) and
strpos( $_SERVER[ 'HTTP_IF_NONE_MATCH' ], $etag ) !== false ) )
{
if( substr( php_sapi_name(), 0, 3 ) === 'cgi' )
header( 'Status: 304 Not Modified' );
else header( 'Not Modified', true, 304 );

/**
* Evite que PHP envoi malgré tout l'entête GZIP
*/
ini_set( 'zlib.output_compression', false );
exit;
}

Lien vers le commentaire
Partager sur d’autres sites

Hé ben dis donc, ça c'est une réponse complète :thumbsup:

Pour ma part, j'avais trouvé cette astuce là pour avoir la possibilité zlib et le gz_handler comme rattrapage :

if (!@ini_set("zlib.output_compression",TRUE))
ob_start("ob_gzhandler");

Lien vers le commentaire
Partager sur d’autres sites

Si le ini_set( "zlib.output_compression" ) ne fonctionne pas, je ne vois pas pourquoi le ob_gzhandler fonctionnerait... enfin sauf si on parle de versions archaïques de PHP (inférieures à la 4.3 à priori).

Lien vers le commentaire
Partager sur d’autres sites

Si "zlib" n'est pas présente, ob_gzhandler ne fonctionnera pas pour autant.

De plus, "ini_set()" retourne par défaut l'ancienne valeur. Donc un "if( ! ini_set( 'zlib.output_compression', true ) )" sera déclenché à chaque fois que la compression n'était pas déjà active.

Quant au fait de couper ini_set(), déjà ce serait idiot de la part de l'hébergeur et de plus je ne suis pas certain que ça ne plante pas complètement le script avec un "fatal error, call to undefined function ini_set()" ou un truc du genre.

Lien vers le commentaire
Partager sur d’autres sites

- Tu veux dire qu'il faudrait faire un ini_set et un ini_get dans la foulée pour vérifier que zlib_output_compression est bien actif ?

- Je comprends mal ta première phrase : tu veux dire que ob_gzhandler ne peut pas fonctionner en l'absence de la zlib, ou autre chose ?

Lien vers le commentaire
Partager sur d’autres sites

1) à priori il faudrait vérifier que la fonction existe, et si c'est le cas, vérifier ce qu'elle retourne à coup de "triple égal". Ceci en supposant qu'en temps normal elle ne retourne pas "false" en temps normal non plus :P

2) exactement : comment veux tu faire une compression gz en l'absence de la dite librairie ?

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...