为静态文件缓存指定过期日期

15

当我使用SpeedTest来测试我的网站时,我看到了很多过期时间未指定的错误。你可以在这个页面看到。

我将以下代码添加到我的.htaccess文件中:

## EXPIRES CACHING ##
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 2 days"
</IfModule>
## EXPIRES CACHING ##

但是没有任何变化。你能给我一些建议来指定静态文件的过期日期吗?

服务器:Linux - Apache


如果从开头和结尾删除<IfModule>行会发生什么?如果未安装该模块,则应导致500错误。 - clmarquart
更改配置文件后,您是否重新启动了服务器? - alexyorke
5个回答

40

我喜欢html5boilerplate的方式:

<IfModule mod_expires.c>
  ExpiresActive on

# Perhaps better to whitelist expires rules? Perhaps.
  ExpiresDefault                          "access plus 1 month"

# cache.appcache needs re-requests in FF 3.6 (thx Remy ~Introducing HTML5)
  ExpiresByType text/cache-manifest       "access plus 0 seconds"

# your document html 
  ExpiresByType text/html                 "access plus 0 seconds"

# data
  ExpiresByType text/xml                  "access plus 0 seconds"
  ExpiresByType application/xml           "access plus 0 seconds"
  ExpiresByType application/json          "access plus 0 seconds"

# rss feed
  ExpiresByType application/rss+xml       "access plus 1 hour"

# favicon (cannot be renamed)
  ExpiresByType image/x-icon              "access plus 1 week" 

# media: images, video, audio
  ExpiresByType image/gif                 "access plus 1 month"
  ExpiresByType image/png                 "access plus 1 month"
  ExpiresByType image/jpg                 "access plus 1 month"
  ExpiresByType image/jpeg                "access plus 1 month"
  ExpiresByType video/ogg                 "access plus 1 month"
  ExpiresByType audio/ogg                 "access plus 1 month"
  ExpiresByType video/mp4                 "access plus 1 month"
  ExpiresByType video/webm                "access plus 1 month"

# htc files  (css3pie)
  ExpiresByType text/x-component          "access plus 1 month"

# webfonts
  ExpiresByType font/truetype             "access plus 1 month"
  ExpiresByType font/opentype             "access plus 1 month"
  ExpiresByType application/x-font-woff   "access plus 1 month"
  ExpiresByType image/svg+xml             "access plus 1 month"
  ExpiresByType application/vnd.ms-fontobject "access plus 1 month"

# css and javascript
  ExpiresByType text/css                  "access plus 2 months"
  ExpiresByType application/javascript    "access plus 2 months"
  ExpiresByType text/javascript           "access plus 2 months"

  <IfModule mod_headers.c>
    Header append Cache-Control "public"
  </IfModule>

</IfModule>
希望这对你有用。 来源: https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess

6
您可以使用mod_headers来完成这个技巧:
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
  Header set Cache-Control "max-age=290304000, public"
</FilesMatch>

或者您可以使用mod_expires:

ExpiresByType text/html "access plus 1 month 15 days 2 hours"
ExpiresByType image/gif "modification plus 5 hours 3 minutes"

1

您只需要添加:

ExpiresByType application/javascript "access plus 1 year"

1

我看到你已经安装了PHP(参考WordPress),所以我们将尝试诊断您的问题:

  1. 重新启动您的Apache Web服务器。如果您拥有Apache服务器(命令行访问),您可以像这样执行{{link1:操作}}。
  2. {{link2:创建一个phpinfo页面}}。这将允许您查看已安装的Apache模块。检查您要使用的mod_expires.c模块(应该能够在浏览器中进行CTL-F(查找)请求以查找mod_expires)。如果您找到它-很好!如果没有,则需要在Apache服务器上安装mod_expires。如果您拥有自己的Apache服务器,可以搜索如何为特定操作系统安装模块。如果没有,则可以向您的托管提供商查询如何安装此模块。安装完成后,请继续。
  3. 修改http.conf条目以包含“plus”表达式
  4. 再次重启Apache
  5. 测试 =)

0
也许您没有加载mod_expires,因此整个stanza是无操作的。或者,AllowOverride为None,您的.htaccess文件未被处理。

我可以使用WordPress的.htaccess重写规则。 - Eray
ifModule问题怎么样了?你是用命令行http客户端检查头部还是一直重新运行速度工具来检查? - covener
我对这个不够有经验,所以我无法检查ifModule问题。 - Eray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接