web-dev-qa-db-fra.com

Mise en cache des fichiers JS et CSS - Apache mod_headers ne prend pas effet

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
2
AmadeusDrZaius
<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?)

2
MrWhite