apache启用mod_expires为静态页面加上缓存方法小结

废话

其实吧,我的网站速度现在应该还是可以的吧(诡异的自信)。有小伙伴访问我的博客很慢的吗?在评论告诉我吧!

主机机房在香港,测试结果是这样:
time.png

但是google之前给我的评分甚至不及格!!!一部分原因就是没有缓存。我以为缓存挺难的,没想到这么简单==。现在google评分84分了。开心!


简介

Expires headers字面翻译:到期头,就是告诉浏览器一个过期时间,在这个过期时间之内,浏览器保留缓存的!这样再次进入博客, 就减少了http 请求了,速度就快了!

如何设置

apache主机的博客目录下有一个.htaccess 这样一个文件(有的是隐藏起来了)。这个文件功能很强大。在里面添加一些语句,就能告诉浏览器到期时间了。

下面一些简单的语句。

  • 语句格式1:ExpiresByType 类型 A/M+时间(以秒为单位)

A:access表示从浏览器访问时间算起
M:modification表示文件修改时间算起

如:ExpiresByType image/png A604800 就是设置png格式的缓存时间为7天

  • 语句格式2:ExpiresByType 类型 描述性语言

描述性语言:modification、access、now |plus|years、months、weeks、days、hours、minutes、seconds

如:ExpiresByType image/png “access plus 7 days” 设置png格式的缓存时间为7天

  • 语句格式3:匹配格式
 <FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
  ExpiresDefault A604800
  </FilesMatch>   

表示匹配jpg|jpeg|png|gif|swf格式的文件缓存为7天

是不是很简单!

然后给出我写的,你可以在此基础上根据你的更改频率修改。

<IfModule mod_expires.c>
#开启
ExpiresActive On

#以下是针对不同的文件类型设置不同的缓存时间
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A2592000
ExpiresByType text/css A2592000
ExpiresByType image/gif A604800
ExpiresByType image/png A604800
ExpiresByType image/jpeg A604800
ExpiresByType text/plain A604800
ExpiresByType application/x-shockwave-flash A604800
ExpiresByType video/x-flv A604800
ExpiresByType application/pdf A604800
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType image/svg A604800

</IfModule>

一些规则

  • 静态文件:落实“永不过期”的原则,通过设置一个足够长的过期时间来实现。
  • 动态文件:设置一个适当的 Cache-Control 头。怎么才算适当?原则很简单,根据这个动态内容的变更频率做出设置,经常修改的,就设置较短的过期时间,不怎么变动的就设置长一些的过期时间。

  • html文件绝对不要缓存,否则会出现一系列的问题!这一点在 PageSpeed 的 Leverage browser caching 规则中也明确提到了:

In general, HTML is not static, and shouldn’t be considered cacheable.

  • 通常是这些文件类型需要缓存:

    • Images: jpg, gif, png
    • favicon/ico
    • JavaScript: js
    • CSS: css
    • Flash: swf
    • PDF: pdf
    • media files:视频,音频文件
  • 为静态文件名加上时间戳或版本号(非常重要!不然访客怎么知道你的要不要清除缓存来获得最新的代码文件呢)

最后要注意的就是添加了(长时间的) Expires headers 的文件,如果在设置的过期时间内需要修改时,你必须修改文件名或者添加修改文件的时间戳。这样用户再访问页面时,才会向服务器请求新文件。例如你需要修改首页的layout.css文件,你可以这么处理:

// 原来的调用处理
<link href="/css/layout.css" rel="stylesheet" />

// 调用新文件的处理
<link href="/css/layout-v20140913.css" rel="stylesheet" />

// 或者这么处理
<link href="/css/layout.css?version=v20140913" rel="stylesheet" />

参考文章

apache启用mod_expires或mod_headers设置静态文件缓存时间
前端性能优化:Add Expires headers

Last modification:October 29th, 2016 at 05:27 pm
If you think my article is useful to you, please feel free to appreciate

10 comments

  1. FeiYang

    美国3秒打开,捷克5秒,日本2秒多点。。。这CDN地域歧视

    1. 友人C
      @FeiYang

      我现在的cdn多半是废的CDN,加上之后,速度比不加要慢很多。。。

  2. 十四行詩

    有进步#

    1. 一日
  3. 一日

    手机访问有异常的请清楚缓存和cookie试试#[呀咩爹]

  4. 拾叁同学
    [小乖]话说博主为何不用PJAX
    1. 一日
      @拾叁同学

      不是不想用,而是不会呀,主题虽然内置了,但是pjax会使好多js需要修改,好麻烦,我也不太懂pjax。我在想等我技术好点,自己写pjax,满足我的需求#[乖]

      1. 拾叁同学
        @一日

        博主有试过吗?貌似没什么影响吧……要是有部分JS有异常的话就单独把那个JS加入data-no-instant就行了

        1. 一日
          @拾叁同学

          嗯,之前用过,有点问题,我不懂pjax。。。找个时间系统学学吧#[小乖]

  5. 拾叁同学

    话说PJAX效果更好,缓存这东西和CDN差不多,从某种意义来讲还不如CDN,毕竟如果要更新文件的话 挺麻烦的~

Leave a Comment