我已经在<img> tag not respecting max-age, and unnecessarily reloading images问了这个问题,并认为这些评论提供了令人满意的答案,但事实证明我错了。在那之后的六个月里,我想我已经想出了一个解决方案,但是在实现它之前想要在这里查看它。它会起作用吗?是否值得实施?更简单的解决方案?等
为了简要地重新描述问题,我有一个cgi程序,为html页面生成带有以下标签的gif图像
<img src="http://example.com/cgi-bin/gifprogram.cgi?query_string">
?query_string 指定要生成的图像,一旦程序生成图像,图像将缓存在 cachedirectory / 文件名 .gif filename 被选为?query_string 的md5-hash。然后,后续标记调用相同的图像只会得到相同的缓存文件。
因此浏览器可以使用自己的缓存,但将标记视为动态标记,并在每次看到标记时一次又一次地重新下载相同的,通常很大的图像,无论最大年龄或任何其他http-header信息(我可以考虑尝试)。好的,我理解为什么“动态”是实际动态cgi应用程序所必需的。但是应该有一种方法可以告诉浏览器“静态”。似乎没有任何标准方式,所以这是我的kludge ......
在服务器端,我将编写一个名为 checkcache.cgi?表达式 的简短cgi程序,它检查缓存目录中是否有的文件名md5hash(表达式),即它将检查是否已经缓存了所需的图像。它的输出到stdout将是通常的http标题,以文本/文本结尾,然后是完整的 path / filename.ext 到与 表达式<对应的缓存文件如果所需图像尚不存在,则显示为“em> 或”notfound“。
在客户端,而不是直接写&lt; img&gt;标签,我将编写一个PHP脚本,其中包含所需的 表达式 并执行以下操作。首先,它使用curl来curl_exec()checkcache.cgi。然后,如果缓存的文件已经存在,则回显为静态&lt; img&gt;标记,使用 src =“http://etc/filename.gif”,使用checkcache返回的文件名。但是如果checkcache返回“not found”,则回显动态标签以动态运行gifprogram.cgi。
由于checkcache只发出几十个字节(而不是某些有时可以运行半MB或更多的gif),它应该快速实现。那么,我的问题再次出现 - 上述策略会起作用,对吧?或者它有什么问题?或者你能提出一个更简单的想法吗?感谢。
-------------------------------------------- ---------------------
修改更新:是的,这有效。最后。只是一种非常精细的方式来完成我认为应该是一项简单的任务。而且我仍然有兴趣学习一些更简单的程序。