Html <;img>;标签不尊重最大年龄,不必要地重新加载图像

Html <;img>;标签不尊重最大年龄,不必要地重新加载图像,html,browser-cache,cache-control,Html,Browser Cache,Cache Control,我有一个用C编写的cgi程序,它输出gif图像,将它们写入标准输出,前面是缓存控制线 fprintf(stdout,"Cache-Control: max-age=99999\n"); fprintf(stdout,"Content-Length: %d\n",nbytes); fprintf(stdout,"Content-Type: image/gif\n\n"); CGI从带有表单标记的HTML页面调用 <img src="http://example.com/cgi-bin/gi

我有一个用C编写的cgi程序,它输出gif图像,将它们写入标准输出,前面是缓存控制线

fprintf(stdout,"Cache-Control: max-age=99999\n");
fprintf(stdout,"Content-Length: %d\n",nbytes);
fprintf(stdout,"Content-Type: image/gif\n\n");
CGI从带有表单标记的HTML页面调用

<img src="http://example.com/cgi-bin/gifprogram.cgi?query_string">

其中query_string是描述程序生成的gif的常用形式变量=value&etc。它工作正常(至少在我测试过的范围内),但是每当我重新加载HTML页面时,图像都会被重新下载,尽管程序发出的最大时间

静态图像,即其中src=”http://example.com/image.gif“指向一个文件,看起来工作正常,它们只是从客户端浏览器缓存中重新加载。因此,我猜测(完全猜测)问题与标记在服务器上动态运行程序这一事实有关,而这一事实以某种方式覆盖了最大年龄。是这样吗?还是怎样如果有办法的话,我如何让浏览器在重新加载页面时重新使用缓存的图像

注意:我正在使用Linux(Slackware 14.2)firefox 45.2.0进行测试,但在Mozilla和Konqueror中也看到了相同的行为。没有机会尝试Windows

编辑感谢@JefréN提供的解决方案,下面是正在运行的程序的演示


@prashanthpadala你忘了大写“Firefox”:)只要我们学究气十足,我就留下了你的“is the惯常形式”,但我原来的“is of the惯常形式”更正确。当有疑问时,试着填写任何遗漏的单词。在本例中,这将是“查询字符串按常规格式格式化”。查询字符串不是“常用形式”,它是一个字符串。该字符串的格式为“常规格式”。我只是简单地将其缩短为“通常形式”的白话。但删除“of”是完全错误的。如果你想学究气,好吧。但要尽量做到正确。这个建议不能保证,但我认为你的问题是因为动态url。我们没有听说过向资源url添加查询参数以强制浏览器始终加载资源吗?您使用的是哪台服务器?你能为你的配置添加规则吗?谢谢你的提议;非常感谢。然而,你找到的解决方案甚至不是我所想的。(我打算尝试一种重定向类型的方案。)因为你找到了答案,而这不是我所期望的,我认为它不是。。。贴出我不知道的答案是合乎道德的。:)不过,在解决问题方面做得不错。:)@JefréN.:“难道我们没有听说过向资源url添加一个查询参数以强制浏览器始终加载资源吗?”-这被称为缓存buster,每次都使用不同的参数值(如当前时间戳),以便使它们与浏览器的url不同,因此无法从缓存中获取(因为每个人之前从未被客户端请求过不同的URL。)但这并不意味着所有“动态URL”都阻止缓存本身。@prashanthpadala您忘记大写“Firefox”:)只要我们学究气,我就留下了您的“is the惯常形式”,但我原来的“is of the惯常形式”更正确。当有疑问时,试着填写任何遗漏的单词。在本例中,这将是“查询字符串按常规格式格式化”。查询字符串不是“常用形式”,它是一个字符串。该字符串的格式为“常规格式”。我只是简单地将其缩短为“通常形式”的白话。但删除“of”是完全错误的。如果你想学究气,好吧。但要尽量做到正确。这个建议不能保证,但我认为你的问题是因为动态url。我们没有听说过向资源url添加查询参数以强制浏览器始终加载资源吗?您使用的是哪台服务器?你能为你的配置添加规则吗?谢谢你的提议;非常感谢。然而,你找到的解决方案甚至不是我所想的。(我打算尝试一种重定向类型的方案。)因为你找到了答案,而这不是我所期望的,我认为它不是。。。贴出我不知道的答案是合乎道德的。:)不过,在解决问题方面做得不错。:)@JefréN.:“难道我们没有听说过向资源url添加一个查询参数以强制浏览器始终加载资源吗?”-这被称为缓存buster,每次都使用不同的参数值(如当前时间戳),以便使它们与浏览器的url不同,因此无法从缓存中获取(因为每个单独的、不同的URL以前从未被客户端请求过。)但这并不意味着所有“动态URL”本身都阻止了缓存。