FREE THOUGHT · FREE SOFTWARE · FREE WORLD

Home » Hacking » Speed up your site with Caching and cache-control

Speed up your site with Caching and cache-control

Speed up your site with Caching and cache-control

April 10th, 2007

Caching with .htaccess and Apache will take your website and your web skills to the next level. This is some technical and advanced methods condensed to simple htaccess code examples for you. But you must take the time to understand caching with cache-control and other headers and HTTP options before you implement on a production server.

More detailed article: Speed Up Sites with htaccess Caching.

NOTE: Stay tuned I'm working on the update!

| .htaccess Tutorial Index |


Easy Apache Speed Tips Articles

Caching with both mod_expires + mod_headers

# Turn on Expires and set default to 0
ExpiresActive On
ExpiresDefault A0
 
# Set up caching on media files for 1 year (forever?)
<filesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
ExpiresDefault A29030400
Header append Cache-Control "public"
</filesMatch>
 
# Set up caching on media files for 1 week
<filesMatch "\.(gif|jpg|jpeg|png|swf)$">
ExpiresDefault A604800
Header append Cache-Control "public"
</filesMatch>
 
# Set up 2 Hour caching on commonly updated files
<filesMatch "\.(xml|txt|html|js|css)$">
ExpiresDefault A7200
Header append Cache-Control "proxy-revalidate"
</filesMatch>
 
# Force no caching for dynamic files
<filesMatch "\.(php|cgi|pl|htm)$">
ExpiresActive Off
Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
Header set Pragma "no-cache"
</filesMatch>

Caching with mod_headers

# 1 YEAR
<filesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
Header set Cache-Control "max-age=29030400, public"
</filesMatch>
 
# 1 WEEK
<filesMatch "\.(jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "max-age=604800, public"
</filesMatch>
 
# 3 HOUR
<filesMatch "\.(txt|xml|js|css)$">
Header set Cache-Control "max-age=10800"
</filesMatch>
 
# NEVER CACHE
<filesMatch "\.(html|htm|php|cgi|pl)$">
Header set Cache-Control "max-age=0, private, no-store, no-cache, must-revalidate"
</filesMatch>

Caching with mod_expires

ExpiresActive On
ExpiresDefault A0
 
# 1 YEAR
<filesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
ExpiresDefault A29030400
</filesMatch>
 
# 1 WEEK
<filesMatch "\.(jpg|jpeg|png|gif|swf)$">
ExpiresDefault A604800
</filesMatch>
 
# 3 HOUR
<filesMatch "\.(txt|xml|js|css)$">
ExpiresDefault A10800"
</filesMatch>

Other Speed Tips

To truly speed up your site, you will want to implement a server-side caching technique. Or you can read more about caching and web cache.

Apache Caching Guide

This document supplements the <a href="http://askapache.info/trunk/mod/mod_cache.html" title="Apache mod_cache">mod_cache</a>, <a href="http://askapache.info/trunk/mod/mod_disk_cache.html" title="Apache mod_disk_cache">mod_disk_cache</a>, <a href="http://askapache.info/trunk/mod/mod_mem_cache.html" title="Apache mod_mem_cache">mod_mem_cache</a>, <a href="http://askapache.info/trunk/mod/mod_file_cache.html" title="Apache mod_file_cache">mod_file_cache</a> and htcacheclean reference documentation.

It describes how to use Apache's caching features to accelerate web and proxy serving, while avoiding common problems and misconfigurations.

htaccess time cheatsheet

#      300   5 MIN
#      600  10 MIN
#      900  15 MIN
#     1800  30 MIN
#     2700  45 MIN
#     3600   1 HR
#     7200   2 HR
#    10800   3 HR
#    14400   4 HR
#    18000   5 HR
#    36000  10 HR
#    39600  11 HR
#    43200  12 HR
#    46800  13 HR
#    50400  14 HR
#    54000  15 HR
#    86400   1 DAY
#   172800   2 DAY
#   259200   3 DAY
#   345600   4 DAY
#   432000   5 DAY
#   518400   6 DAY
#   604800   1 WEEK
#  1209600   2 WEEK
#  1814400   3 WEEK
#  2419200   4 WEEK
#  4838400   2 MONTH
#  7257600   3 MONTH
#  9676800   4 MONTH
# 12096000   5 MONTH
# 14515200   6 MONTH
# 16934400   7 MONTH
# 19353600   8 MONTH
# 21772800   9 MONTH
# 24192000  10 MONTH
# 26611200  11 MONTH
# 29030400  12 MONTH

htaccess Guide Sections

| .htaccess Tutorial Index |



Please Comment!

Your email address is not saved.

Reader Comments

  1. AskApache ~April 26, 2012 @ 7:42 am

    @Mike

    Yes. Try using the RequestHeader to rewrite the cache headers for specific IPs. Or set an environment variable when the visitor IP is the single IP to target, then only send the various anti-caching Header directives when that environment variable is present.

  2. Mike ~April 24, 2012 @ 8:36 pm

    What if I want to disable cache specifically for a single IP address, while everyone else who browses the site gets a standard length? Right now I'm trying this code below, but it's disabling the cache for everyone, not just the intended target.

    allow from xxx.xxx.xxx.xxx
    Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
    Header set Pragma "no-cache"
    allow from all
    Header set Cache-Control "max-age=86400, public"

    Is this possible?

  3. Kristy ~January 17, 2012 @ 2:53 pm

    I found this site as I was editing the .htaccess to improve performance and to block spammer and proxies.

    Your site explained it very well. Almost everywhere else was just badly written.

    Perhaps if your interested I can send you an optimized htaccess file that blocks most content scraper, spam bots and lots of caching (browser as well as server side)...

  4. tophi ~August 30, 2011 @ 4:12 am

    And what about ppl using Nginx ?

  5. Flasheur ~August 26, 2011 @ 3:55 am

    Hi, very interesting stuff! I just noticed a little mistake in the "caching with mod_expires" part, the ExpiresDefault parameter for 1 year should be A29030400 instead of A9030400 according to the time cheatsheet. Thanks again for your article.

  6. Danny ~July 13, 2011 @ 2:32 pm

    I used Caching with both mod_expires + mod_headers but I received a 500 error. Website is being hosted by earthlink.

  7. ravi ~June 20, 2011 @ 8:41 am

    this solved my problem .thanks for this useful post

  8. Review Monsters ~April 9, 2011 @ 2:58 pm

    Thank you for this post, easy to follow and has really decreased our load time. Thank you again!

  9. Aneeza Mubbashir ~April 7, 2011 @ 2:39 am

    Thanks for the article. I have been searching for a long time trying to figure out how to use header expires, this was extremely helpful. You can count on me for a few links here and there!

  10. Pingback: Understanding Web Caching - dgendill.com
  11. Eric Gillette ~January 27, 2011 @ 4:00 pm

    This definitely helped!

    I have a client with a wildy popular blog and they were having lots of site slow-downs.

    After setting this up in httpd.conf, the rest was history!

    Everything is a bit faster now! Thanks so much.

  12. Tig ~January 20, 2011 @ 11:50 am

    One of the greatest articles i found on the web. Thanks.

  13. Pingback: Two Drifters » Blog Archive » Seiten beschleunigen
  14. fara ~September 13, 2009 @ 3:07 pm

    thanks... very useful article that saved me from searching.
    good luck

  15. Frank ~February 2, 2009 @ 11:09 am

    I find these code quite interesting and i have noticed a better performance in my blog already. What i would like to know if i can use the first code at the beginning of this page:

    # Turn on Expires and set default to 0
    ExpiresActive On
    ExpiresDefault A0
     
    # Set up caching on media files for 1 year (forever?)
    ExpiresDefault A29030400
    Header append Cache-Control "public"
     
    # Set up caching on media files for 1 week
    ExpiresDefault A604800

    ... with this other one:

    # 1 YEAR
    Header set Cache-Control "max-age=29030400, public"
     
    # 1 WEEK
    Header set Cache-Control "max-age=604800, public"
     
    # 2 DAYS
    Header set Cache-Control "max-age=172800, proxy-revalidate"
     
    # 1 MIN
    Header set Cache-Control "max-age=60, private, proxy-revalidate"

    Since i am not into these things it looks like if i use both of them my website is faster, but i would like an input from you to see if i am right or now.

    Also, i understand the second code i wrote in this comment but.. what is the difference between these two codes simply put? thanks and i hope to get a reply from you

  16. Erik Bauffman ~October 23, 2008 @ 9:33 am

    I was wondering. Say I want to my .css files to be cached for 15 minutes, my .html files for another 30 minutes and no cache at all for my .php files. How can I do this easily ?

  17. Jason ~April 7, 2008 @ 8:24 pm

    Thanks for the article. I have been searching for a long time trying to figure out how to use header expires, this was extremely helpful. You can count on me for a few links here and there!

  18. Daniel ~August 12, 2007 @ 9:44 am

    I couldn't understand some parts of this article o.us poetry, but I guess I just need to check some more resources regarding this, because it sounds interesting.


It's very simple - you read the protocol and write the code. -Bill Joy

Except where otherwise noted, content on this site is licensed under a Creative Commons Attribution 3.0 License, just credit with a link.
This site is not supported or endorsed by The Apache Software Foundation (ASF). All software and documentation produced by The ASF is licensed. "Apache" is a trademark of The ASF. NCSA HTTPd.
UNIX ® is a registered Trademark of The Open Group. POSIX ® is a registered Trademark of The IEEE.

Site Map | Contact Webmaster | Glossary | License and Disclaimer | Terms of Service |

↑ TOPMain