Comme suggéré par ne réponse sur SO , j'essaie d'utiliser un numéro de version sur mes fichiers JS et CSS afin que le navigateur ne fasse une demande que lorsque le numéro de version JS ou CSS est modifié dans mon PHP fichier. Pour faciliter ceci, j'ai une réécriture dans mon httpd.conf
qui transforme un fichier demandé tel que myscript--20140904.js
en myscript.js
. Comme je fais les choses de cette façon, je veux que le navigateur mette le fichier en cache pendant longtemps, car il verra une demande pour un fichier "différent" lorsque ce numéro de version sera mis à jour.
Selon ne réponse sur Webmasters.SE , je peux utiliser FilesMatch
avec Header set Cache-Control
pour ne mettre en cache que les fichiers CSS/JS portant le numéro de version.
Et selon ne réponse sur SO , seul Cache-Control
est nécessaire, car il a priorité sur Expires
de toute façon.
Mais ça ne fonctionne pas. Le champ d'en-tête Cache-Control
est manquant dans la réponse.
Voici ma configuration Apache:
RewriteEngine on
RewriteRule ^(.*)\-\-.+\.(css|js)$ $1.$2
<IfModule mod_headers.c>
<FilesMatch "^(.*)\-\-.+\.(js|css)$">
Header set Cache-Control "max-age=15552000"
Header unset ETag
Header unset Last-Modified
</FilesMatch>
</IfModule>
# <IfModule mod_expires.c>
# <FilesMatch "\.(js|css)$">
# ExpiresActive On
# ExpiresByType text/javascript "access plus 6 months"
# ExpiresByType text/css "access plus 6 months"
# </FilesMatch>
# </IfModule>
Voici une demande pour l'un des fichiers JS:
http://localhost/[url]/common.js
GET [url]/common.js HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:31.0) Gecko/20100101 Firefox/31.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://localhost/[refererUrl]
Cookie: PHPSESSID=[cookie]
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
HTTP/1.1 200 OK
Date: Thu, 04 Sep 2014 19:45:32 GMT
Server: Apache
Last-Modified: Wed, 03 Sep 2014 22:55:57 GMT
Etag: [etag]
Accept-Ranges: bytes
Content-Length: 5167
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/javascript
<FilesMatch "^(.*)\-\-.+\.(js|css)$">
FilesMatch
prend un nom du fichier et correspond au système de fichiers, pas à l'URL. Le fichier sous-jacent s'appelle toujours "myscript.js". Ce motif devrait donc ressembler à ceci: \.(js|css)$
(À part ... votre demande d'exemple semble être pour common.js
- ce qui n'aurait pas correspondu à votre modèle de toute façon - ne devrait-il pas en être ainsi pour common--20140904.js
?)