强制浏览器缓存一些文件

时间:2014-05-29 12:30:07

标签: javascript php image caching dynamic-content

我在数据库中有很多图像。图像数据存储在具有id的二进制列中。我写了一个PHP脚本来读取这些数据并输出正确的内容类型和数据。

每当我想在页面上显示图像时,我会将/image.php?id=1放在其中1是图像标记的src字段中数据库中图像的id。这一切都运作良好。

现在每次我再次访问该页面或使用javascript修改某些图像的src时,它似乎再次从服务器加载该图像。例如,我有一张图片:<img src="/image.php?id=4" />。当我将鼠标悬停在此图像上时,我使用javascript动态地将src更改为/image.php?id=5。这会导致从服务器再次加载图像,这需要1到3秒。使用文档开头的像素大小的图像预加载此图像不起作用。我猜这是因为我实际上是在查询动态PHP脚本。

有没有办法让浏览器缓存图像,如果它们具有相同的ID?如果有的话,我的数据库中的图像ID很少会改变。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

文件名仅因查询参数而异的缓存内容不可靠。例如,某些代理服务器会将“style.css?v1”和“style.css?v2”视为同一文件。这将导致资产出现意外问题,这些资产依赖于查询参数作为修订号。

在文件名

中包含修订

您知道的每个资产将来都会被更改( css和js主要是),将在名称或路径中包含修订:

  • css/style_v1.css代替css/style.css?v1
  • css/v1/style.css代替css/style.css?v1

基于文件名的缓存清除

如果您没有适当的构建过程,此方法将对您有所帮助。您将保留名称未更改的文件名(即:style.css),并在mod_rewrite的一些帮助下重写从/css/style.<revision>.cssstyle.css的请求。

  1. 在您的HTML中:

    <link rel="stylesheet" href="css/style.432.css">
    
  2. 从.htaccess您将该请求类型路由到css/style.css

    <IfModule mod_rewrite.c>
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.+)\.(\d+)\.(css|cur|gif|ico|jpe?g|js|png|svgz?|webp)$ $1.$3 [L]
    </IfModule>
    
  3. 下次更改style.css中的内容时,从HTML文件更改css文件的修订号:

    <link rel="stylesheet" href="css/style.433.css">
    
  4. 如果您使用的是VCS,您甚至可以使用当前提交作为资产的修订号,这有助于识别测试阶段的问题,当您经常在分支机构之间切换以测试应用程序的不同方面时。

    了解更多: