Add Expires headers for specific files in .htaccess file

1.1k views Asked by At

I'm trying to add browser caching rules to my .htaccess file, with different expiry rules for files in a certain directory. The general rules are being applied OK but the directory specific rules are not.

This is the section in my .htaccess file (the FilesMatch rule is to target the directory):

<IfModule mod_expires.c>
  ExpiresActive On

  # Images
  ExpiresByType image/jpeg "access plus 1 day"
  ExpiresByType image/gif "access plus 1 day"
  ExpiresByType image/png "access plus 1 day"
  ExpiresByType image/webp "access plus 1 day"
  ExpiresByType image/svg+xml "access plus 1 day"
  ExpiresByType image/x-icon "access plus 1 day"

  # CSS, JavaScript
  <FilesMatch "^(assets/foundation/5.5.3)$">
    ExpiresByType text/css "access plus 1 year"
    ExpiresByType text/javascript "access plus 1 year"
    ExpiresByType application/javascript "access plus 1 year"
  </FilesMatch>
  ExpiresByType text/css "access plus 1 day"
  ExpiresByType text/javascript "access plus 1 day"
  ExpiresByType application/javascript "access plus 1 day"

  # Others
  ExpiresByType application/pdf "access plus 1 day"
</IfModule>

These are the files I'm trying to target:

https://cm.anyware.co.nz/assets/foundation/5.5.3/css/normalize.css
https://cm.anyware.co.nz/assets/foundation/5.5.3/css/foundation.min.css
https://cm.anyware.co.nz/assets/foundation/5.5.3/js/vendor/modernizr.js
https://cm.anyware.co.nz/assets/foundation/5.5.3/js/vendor/jquery.js
https://cm.anyware.co.nz/assets/foundation/5.5.3/js/foundation.min.js
https://cm.anyware.co.nz/assets/foundation/5.5.3/js/foundation.dropdown.js
https://cm.anyware.co.nz/assets/foundation/5.5.3/js/foundation.topbar.js

GTMetrix says these static components do not have a far-future expiration date.

What am I doing wrong please?

1

There are 1 answers

0
MrWhite On
<FilesMatch "^(assets/foundation/5.5.3)$">

The <FilesMatch> (and <Files>) directive matches against the filename only, eg, normalize.css, foundation.min.css, etc. which is not what you require.

The easiest way to target this specific directory only is to create another .htaccess file in this directory with the necessary overrides.

Alternatively, you can use an Apache Expression on Apache 2.4+ and check against the REQUEST_URI, although this isn't necessarily the same as the directory (depending on your system).

For example:

<If "%{REQUEST_URI} =~ m#^/assets/foundation/5\.5\.3/#">
    ExpiresByType text/css "access plus 1 year"
    ExpiresByType text/javascript "access plus 1 year"
    ExpiresByType application/javascript "access plus 1 year"
</If>