HTACCESS图像缓存规则,用于检查图像修改时间

时间:2012-02-05 16:35:08

标签: php apache .htaccess caching

我以两种不同的方式提供图像:

  1. 使用PHP脚本作为个人资料图片,例如
  2. 直接指向他们,例如图标和背景
  3. 我正在正确处理他们的缓存,我对此完全陌生。

    对于PHP脚本,我只是在响应中添加Last-Modified标头,如果再次调用则提供304 status code,如果文件未更改则提供 (使用filemtime())。

    对于直接访问,我使用的是HTACCESS,但到目前为止我看到的每条规则都不允许我在PHP脚本中执行相同操作(检查文件是否已更改,然后提供304或文件本身) )。

    这是我计划使用的HTACCESS规则:

    Header unset Pragma
    FileETag None
    Header unset ETag
    
    # cache images/pdf docs for 10 days
    <FilesMatch "\.(ico|pdf|jpg|jpeg|png|gif)$">
      Header set Cache-Control "max-age=864000, public, must-revalidate"
      Header unset Last-Modified
    </FilesMatch>
    

    据我所知,更新缓存图片的唯一方法是重命名。有人知道解决方法吗?例如,通过检查图像的最后修改日期?

3 个答案:

答案 0 :(得分:2)

如果可以,您可以使用mod_expires

<FilesMatch "\.(ico|pdf|jpg|jpeg|png|gif)$">
  ExpiresDefault "modification plus 10 days"
</FilesMatch>

答案 1 :(得分:1)

您在使用PHP时应该自动为静态文件执行apache。如果在请求中找到if-Modified-since,它将设置Last-Modified标头并以304响应。这是自动完成的,与缓存无关。它不会阻止对您的服务器的重复请求,它只会通过返回304信息而不是整个文件来保存文件未被修改时的带宽(以及用户的加载时间)。

为了防止对服务器的重复请求,浏览器(和代理服务器)必须进行一些缓存。您可以通过HTTP标头控制缓存,也可以通过META标签控制HTML。当您指定文件可缓存1周时,浏览器将不会尝试联系您的服务器1周(尽管大多数浏览器设置为在启动后首次访问时重新验证缓存条目。)

因此,您可能会遇到某些用户将使用旧缓存副本一段时间(取决于到期标头)的可能性,或者您必须按照Gerben的建议更改您的URL。只有这样你才能100%确定每个人都会得到新版本(这对javascript来说很重要,因为有些js文件旧了,有些新版本可能会出现非常奇怪的错误)。如今几乎每个高性能网站都使用file.ext?v=3方法,这样他们就可以将到期标头设置为大的值,比如6个月。

答案 2 :(得分:1)

正如@Gumbo指出的那样,“Apache应该已经为静态文件做了”。 这是真的,Apache做到了,所以这种东西工作得很好:

<FilesMatch "\.(ico|pdf|jpg|jpeg|png|gif)$">
    Header set Cache-Control "max-age=864000, public, must-revalidate"
</FilesMatch>

ps:抱歉@Gumbo,但我请你改变你的答案,以便我能接受,但你不会这样做,我不得不最终关闭这个问题,所以。