web-dev-qa-db-fra.com

Définition du contrôle du cache sur les fichiers sans extension

Nous utilisons ExpressionEngine en tant que système de gestion de contenu. Il vous permet de définir le "type" du fichier lorsque vous créez un modèle et lorsque vous le nommez, vous n'avez pas à lui donner une extension.

J'ai utilisé cela pour configurer le contrôle du cache, mais cela ne fonctionne pas sur beaucoup de mes fichiers javascript et css car ils ne possèdent pas les extensions .css et .js. Y at-il un moyen de le faire fonctionner sur le type?

<IfModule mod_expires.c>
    # Enable expirations
    ExpiresActive On 
    # Default directive
    ExpiresDefault "access plus 1 month"
    # My favicon
    ExpiresByType image/x-icon "access plus 1 year"
    # Images
    ExpiresByType image/gif "access plus 6 months"
    ExpiresByType image/png "access plus 6 months"
    ExpiresByType image/jpg "access plus 6 months"
    ExpiresByType image/jpeg "access plus 6 months"
    # CSS
    ExpiresByType text/css "access plus 4 months"
    # Javascript
    ExpiresByType application/javascript "access plus 6 months"
</IfModule>
<IfModule mod_deflate.c>
    # Force compression for mangled headers.
    # http://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping
    <IfModule mod_setenvif.c>
        <IfModule mod_headers.c>
            SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
            RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
        </IfModule>
    </IfModule>

    # Compress all output labeled with one of the following MIME-types
    # (for Apache versions below 2.3.7, you don't need to enable `mod_filter`
    #  and can remove the `<IfModule mod_filter.c>` and `</IfModule>` lines
    #  as `AddOutputFilterByType` is still in the core directives).

    <IfModule mod_filter.c>
        AddOutputFilterByType DEFLATE application/atom+xml \
        application/javascript \
        application/json \
        application/rss+xml \
        application/vnd.ms-fontobject \
        application/x-font-ttf \
        application/x-web-app-manifest+json \
        application/xhtml+xml \
        application/xml \
        font/opentype \
        image/svg+xml \
        image/x-icon \
        text/css \
        text/html \
        text/javascript \
        text/plain \
        text/x-js \
        text/x-component \
        text/xml
    </IfModule>
</IfModule>

# 
# configure mod_headers
# 
# URL: http://httpd.Apache.org/docs/2.2/mod/mod_headers.html
# 
<IfModule mod_headers.c>
    <FilesMatch "\\.(ico|jpe?g|png|gif|swf|css|js)$">
        Header set Cache-Control "max-age=2692000, public"
    </FilesMatch>
    <FilesMatch "\\.(x?html?|php)$">
        Header set Cache-Control "max-age=600, private, must-revalidate"
    </FilesMatch>
    Header unset ETag
    Header unset Last-Modified
</IfModule>
3
MB34

Par "type", je suppose que vous entendez le type mime , auquel cas vous devriez regarder mod_expires et la directive ExpiresByType - c’est sans aucun doute le moyen le plus simple/moderne de définir les en-têtes de réponse HTTP Expires et Cache-Control (directive max-age) appropriés.

Cela va quelque chose comme:

ExpiresActive On
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/css "access plus 1 month"

Ceci utilise la "syntaxe alternative". Assurez-vous que les types mime indiqués correspondent aux types mime avec lesquels votre serveur répond. (2692000 secondes semblerait être proche de 1 month)

Cependant, si vous devez modifier d'autres directives de l'en-tête Cache-Control, vous devrez toujours utiliser la directive Header.

<FilesMatch "\\.(ico|jpe?g|png|gif|swf|css|js)$">

De plus, la double barre oblique inversée au début de la regex est superflue, il vous suffit d'échapper au point littéral. c'est à dire. "\.(ico| etc.

UPDATE:

J'ai déjà le jeu d'informations ExpiresByType.

La directive Header (mod_headers) sera prioritaire si le conteneur FilesMatch correspondant correspond à . Cependant, vous dites que beaucoup de ces fichiers "n'ont pas d'extensions .css et .js", ils ne correspondront donc pas et les directives ExpiresByType auront priorité dans ces cas-là.

Vous avez un conflit d'intérêts entre vos directives mod_expires et mod_headers. Avec mod_expires (ExpiresByType), vous essayez de mettre en cache les fichiers CSS et JS pendant 4 et 6 mois respectivement. Avec mod_headers (Header), vous indiquez une durée de cache de 1 mois pour les deux?! Donc, sans extension de fichier, ces fichiers vont être mis en cache pendant 4 et 6 mois, quelle que soit votre directive Header.

Notez également que la directive ExpiresByType définit également l'en-tête de réponse Expires HTTP (pour les anciens navigateurs). Cela va entrer en conflit avec l'en-tête Cache-Control que vous définissez manuellement avec la directive Header. Bien que tous les navigateurs modernes devraient donner la priorité à Cache-Control par rapport à Expires.

En gros, vous n'avez pas besoin d'utiliser Header set Cache-Control ... si vous utilisez mod_expires. Ou, si vous le faites, vous devez vous assurer qu'ils font tous les deux la même chose.

2
MrWhite