Let’s check how to use Expires headers in your web server configuration to control caching for your web content. Properly setting Expires headers can improve your website’s performance by reducing the number of requests made to the server.
.htaccess Configuration
The .htaccess
file is used to define directives for the Apache web server. Below is an example of how to set Expires headers in your .htaccess
file:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
ExpiresByType application/x-font-ttf "access plus 1 year"
ExpiresByType application/x-font-opentype "access plus 1 year"
ExpiresByType application/x-font-woff "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresDefault "access plus 2 days"
ExpiresByType text/html "access plus 2 days"
ExpiresByType image/gif "access plus 3 months"
ExpiresByType image/jpeg "access plus 3 months"
ExpiresByType image/jpg "access plus 3 months"
ExpiresByType image/png "access plus 3 months"
ExpiresByType image/x-png "access plus 3 months"
ExpiresByType text/css "access plus 8 days"
ExpiresByType text/javascript "access plus 7 days"
ExpiresByType application/x-javascript "access plus 7 days"
ExpiresByType application/javascript "access plus 7 days"
ExpiresByType image/x-icon "access plus 3 months"
</IfModule>
Reference: Apache HTTP Server Documentation
web.config Configuration
For IIS (Internet Information Services) users, the web.config
file is used to configure caching. Here is an example configuration:
<configuration>
<system.webServer>
<staticContent>
<clientCache cacheControlMode="UseExpires" httpExpires="Tue, 19 Jan 2038 03:14:07 GMT" />
</staticContent>
</system.webServer>
</configuration>
OR
<configuration>
<system.webServer>
<staticContent>
<!-- Set default to 1 day -->
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="1.00:00:00" />
<!-- Override for specific types -->
<remove fileExtension=".svg" />
<mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00">
<add fileExtension=".svg" />
</clientCache>
<!-- Add similar overrides for other mime types as needed -->
</staticContent>
</system.webServer>
</configuration>
Explanation
Adding an Expires
header provides a fully-formatted date and time that follows the specification in RFC 1123. The max-age
directive takes priority over the Expires
header. To use the cacheControlMaxAge
attribute, you need to set the value of the cacheControlMode
attribute to UseMaxAge
.
The default value for max-age
is 1.00:00:00 (1 day). Here is an example of a Cache-Control: max-age=<nnn>
header:
Cache-Control: max-age=86400
Reference: Microsoft Learn Documentation
Best Practices and Considerations
- Resource Types and Durations - Static resources (fonts, images): 3+ months
- Dynamic content (HTML): Shorter duration (2 days)
- CSS/JS files: Medium duration (7-8 days)
- Version-controlled assets: Long duration (1 year)
- Testing Your Configuration
curl -I https://example.com/image.jpg
Look for the Cache-Control
and Expires
headers in the response. 3. Important Notes - max-age
directive takes priority over Expires headers
- Always test changes in a staging environment first
- Consider using versioning for static assets to maintain control over updates
- Monitor performance metrics after implementing changes