Make Browsers Cache Static Files On nginx
Make Browsers Cache Static Files On nginxVersion 1.0 This tutorial explains how you can configure nginx to set the Expires HTTP header and the max-age directive of the Cache-Control HTTP header of static files (such as images, CSS and Javascript files) to a date in the future so that these files will be cached by your visitors' browsers. This saves bandwidth and makes your web site appear faster (if a user visits your site for a second time, static files will be fetched from the browser cache). I do not issue any guarantee that this will work for you!
1 Preliminary NoteI'm assuming you have a working nginx setup, e.g. as shown in this tutorial: Installing Nginx With PHP5 (And PHP-FPM) And MySQL Support (LEMP) On Ubuntu 12.04 LTS
2 Configuring nginxThe Expires HTTP header can be set with the help of the expires directive which can be placed in inside http {}, server {}, location {}, or an if statement inside a location {} block. Usually you will use it in a location block for your static files, e.g. as follows:
In the above example, all .jpg, .jpeg, .png, .gif, .ico, .css, and .js files get an Expires header with a date 365 days in the future from the browser access time. Therefore, you should make sure that the location {} block really only contain static files that can be cached by browsers. Reload nginx after your changes: /etc/init.d/nginx reload You can use the following time settings with the expires directive:
You can use the following time units:
Examples: 1h30m for one hour thirty minutes, 1y6M for one year and six months. Also note that if you use a far future Expires header you have to change the component's filename whenever the component changes. Therefore it's a good idea to version your files. For example, if you have a file javascript.js and want to modify it, you should add a version number to the file name of the modified file (e.g. javascript-1.1.js) so that browsers have to download it. If you don't change the file name, browsers will load the (old) file from their cache. Instead of basing the Expires header on the access time of the browser (e.g. expires 10d;), you can also base it on the modification date of a file (please note that this works only for real files that are stored on the hard drive!) by using the modified keyword which precedes the time: expires modified 10d;
3 TestingTo test if your configuration works, you can install the Live HTTP Headers plugin for Firefox and access a static file through Firefox (e.g. an image). In the Live HTTP Headers output, you should now see an Expires header and a Cache-Control header with a max-age directive (max-age contains a value in seconds, for example 31536000 is one year in the future):
4 Links
About The Author![]() Falko Timme is the owner of
|






Recent comments
9 hours 43 min ago
14 hours 48 min ago
19 hours 12 min ago
21 hours 1 min ago
1 day 11 hours ago
1 day 11 hours ago
1 day 16 hours ago
1 day 22 hours ago
1 day 23 hours ago
2 days 1 hour ago