在我的一个网站上,我只是将我的用户图像以"1.jpg"的形式存储在他们的用户文件夹中。这意味着,每当他们更改个人资料图片时,文件名都保持不变。
我一直想利用图像缓存,这样每当用户的个人资料被查看和重新查看时,就不会一次又一次地下载同一张旧照片,但同时,如果新照片发生了变化,我希望我的用户浏览器下载它。
我怎么能在PHP中做到这一点?
最简单的修复方法是为每个用户的配置文件pick分配一个随机名称GUID.jpg。每当他们更改配置文件pic时,都会为他们分配一个新的GUID。
现在,您可以将此配置文件图片与指令一起发送给客户端,以便永远缓存它。
E-Tagging,上次修改,基本上是头,使浏览器能够决定资源(即配置文件图片)是否已更改,以及是否从服务器下载或从缓存中检索。
我可以建议使用php来调用图片,而不是直接链接它吗?
<?php
$lmt = filemtime($_GET['file']);
$etag = md5($lmt);
header('Content-type: application/x-javascript');
header("Cache-Control: max-age=3600");
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $lmt)." GMT");
header("ETag: ".'"'.$etag.'"');
if(@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lmt || trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
header("HTTP/1.1 304 Not Modified");
exit;
}
?>
然后将在该代码段下方加载内容
此处回答:https://webmasters.stackexchange.com/questions/32481/is-it-worth-it-to-change-my-entire-user-images-file-structure-to-take-advantage
一个常用的解决方案是让你的图像URL看起来像这样:
http://www.example.com/path/to/images/1.jpg?v=123456
这里,/path/to/images/1.jpg
是图像的实际URL路径,而?v=123456
只是一个固定在URL末尾的伪查询。查询字符串可以是任何内容—图像内容的版本号、时间戳和散列—只要你在图像发生变化时对其进行更改,而在图像不发生变化时保持不变。
诀窍是,当被要求提供这样的URL时,web服务器将忽略查询字符串,因为URL实际上指向一个静态文件。但对于用户的浏览器(以及其间的任何代理)来说,具有不同查询字符串的URL将完全不同,因此对查询字符串的任何更改都会迫使浏览器重新加载文件。
因此,您可以将web服务器配置为发送Expires
和Cache-Control
HTTP标头,以允许无限缓存,因为您知道可以通过更改查询字符串来强制重新加载。如果您使用的是带有mod_expires的Apache,那么一种方法是在映像目录中放入一个.htaccess
文件,行为:
ExpiresActive On
ExpiresDefault "access plus 1 year"
许多流行网站都使用这种技术。例如,如果你查看这个页面的HTML源代码,你会发现它的样式表是从这样的URL加载的:
http://cdn.sstatic.net/stackoverflow/all.css?v=7cd8ea9d6f1e
这里,?v=7cd8ea9d6f1e
是一个伪查询字符串,就像我上面描述的一样;您可以通过更改它并看到它确实仍然返回相同的文件来确认这一点。