2010-12-01 47 views
3

J'utilise actuellement cette configuration dans mon vhost:directives Apache VHost Optimisé pour Pagespeed

<Location /> 
    SetOutputFilter DEFLATE 
    BrowserMatch ^Mozilla/4 gzip-only-text/html 
    BrowserMatch ^Mozilla/4\.0[678] no-gzip 
    BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html 
    SetEnvIfNoCase Request_URI \ 
    \.(?:gif|jpe?g|png)$ no-gzip dont-vary 
    Header append Vary User-Agent env=!dont-vary 
</Location> 
<Directory /> 
    ExpiresActive On 
    ExpiresByType text/html "access plus 5 minutes" 
    ExpiresByType text/css "access plus 1 month" 
    ExpiresByType application/x-javascript "access plus 1 month" 
    ExpiresByType application/javascript "access plus 1 month" 
    ExpiresByType text/javascript "access plus 1 month" 
    ExpiresByType image/gif "access plus 1 month" 
    ExpiresByType image/png "access plus 1 month" 
    ExpiresByType image/jpg "access plus 1 month" 
    ExpiresByType image/jpeg "access plus 1 month" 
    ExpiresByType image/x-icon "access plus 1 month" 
    ExpiresDefault "access plus 1 day" 

    <FilesMatch "\.(ico|jpeg|pdf|flv|jpg|png|gif|js|css|swf)$"> 
    Header set Cache-Control "max-age=2592000, public" 
    Header unset Last-Modified 
    Header unset ETag 
    FileETag None 
    </FilesMatch> 
    <FilesMatch "\.(html|php)$"> 
    Header set Cache-Control "max-age=900, public, must-revalidate" 
    </FilesMatch> 
</Directory> 

Bien qu'il fonctionne très bien pour accélérer la chose, parfois les utilisateurs ne voient pas les changements qu'ils themselfs ont fait sur le contenu (principalement en utilisant FireFox) :(des suggestions/conseils d'optimisation?

Répondre

0

le problème est ici votre navigateur caches javascript, css et les images et donc ne saurez pas si vous avez quoi que ce soit modifié dans le serveur à moins que le cache expire.

Pour Par exemple, considérez Ve un fichier JS nommé script.js. Selon les règles suivantes que vous avez dans votre fichier htaccess,

ExpiresByType application/x-javascript "access plus 1 month" 
ExpiresByType application/javascript "access plus 1 month" 

les fichiers javascript sont mises en cache pour un mois et donc pas de nouvelles demandes seront posées pour les fichiers JS pour 1 mois à moins que le cache est effacé manuellement.

Comment résoudre ce problème.

En supposant que votre nom de fichier est script.js, dans le fichier HTML, vous devez inclure est comme

<script src="includes/script.100.js" type="text/javascript"></script> 

ou

<link rel="stylesheet" type="text/css" href="includes/style.100.css" /> 

100 pourrait être un nombre. J'augmente d'habitude si de 1, 2, 3 .. et ainsi de suite (numéro de version pour être précis).

Maintenant, dans mon htaccess, j'ai quelque chose comme

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^includes/style\.[\d]+\.css$ /includes/style.css [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^includes/script\.[\d]+\.js$ /includes/script.js [L] 

Les deux conditions ci-dessus assure que le fichier réel est utilisé, peu importe quel numéro est utilisé entre le nom et le type de fichier. Cela garantit que chaque fois que vous modifiez le numéro de version, tout votre ancien cache expire et tous les utilisateurs voient le dernier code.

+0

désolé, mais ce n'est pas le problème, toutes les images contiennent un horodatage quand ils sont créés/modifiés/créés dans un nouveau format, aussi faire des fichiers CSS et JS en raison de la compression et le renommage Je suis confronté à ce que j'ai décrit, un utilisateur modifie le contenu (le contenu stocké dans la db affichée dans une page html générée via php) après avoir fait les modifications/est redirigé du backend à la page sur le frontend qu'il ne voit pas les changements à moins qu'il ne fasse un rafraichissement de la page (et non, ce n'est pas un problème de cache du serveur [memcached/apc]) – Hannes

0

affichage ce commentaire après la réponse de Hannes que la question est basée sur le contenu et non dans les fichiers js/css ..

J'ai eu cette question une fois, mais ne pouvait pas clouer pour comprendre ce qui est la question. J'ai supposé que la raison pourrait être que la page HTML est mise en cache quelque part dans le serveur proxy entre moi et le navigateur. Donc, ce que j'ai fait a été généré avec un paramètre de requête appelé hash, qui avait quelque chose comme md5 (time ("U"));

Par exemple, l'URL qui avait le même problème était quelque chose comme

http://test.com/controller/functionname/

Après cette question, j'ai changé de sorte que tous les urls l'utilisateur clique est quelque chose comme

http://test.com/controller/functionname/?hash= {quelque chose }

J'espère que cela fonctionne pour vous. Aussi, pour être sûr à deux, vous pouvez ajouter dans votre page Web.

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"> 
1

Au lieu de forcer le navigateur à cache, vous devez envoyer un en-tête doit-revalidate et contrôler la mise en cache à partir de votre langage de programmation (par exemple, PHP) en envoyant un Expires et en-tête Last-Modified. Le navigateur demandera alors à votre site la dernière version à chaque demande, mais assurez-vous de répondre avec une page vide si rien n'a changé.

Cela peut prendre du temps à implémenter, mais cela fonctionne définitivement.