取回的缓存清除映像使用查询参数

时间:2019-07-05 04:52:33

标签: javascript html css image caching

我正在使用查询参数(例如:

)从网址来源获取图片

www.server.com/get?img.jpg

但是,当服务器更改图像时,由于图像已缓存,我无法获得最新副本。关于stackoverflow的大多数答案都说添加了用于缓存清除的查询参数,但这在这种情况下不起作用。尝试过:

www.server.com/get?img.png&id=1123

有什么想法/建议吗?谢谢

编辑:id =之后的数字是随机的。

1 个答案:

答案 0 :(得分:1)

在这种情况下,查询参数隐含为始终更改。如果您仅添加&id=1123,将不会有任何改变。

尝试添加nnnn等于当前时间(以秒为单位)的&t=nnnn

或者,如果您在同一台服务器上生成链接,最好还是将秒的图像修改时间(以秒为单位)或用作时间戳记:

?img.png&t=2019-07-04.17.03.22

更新

您是这样说的

 http://www.server.com/get?img.png&id=1

 http://www.server.com/get?img.png&id=2

被浏览器视为同一图像。我发现这很难接受,因为(除其他事项外)这是一个安全漏洞-这意味着get?report.pdf&user=whoknows&password=whatever可能最终会下载get?report.pdf&user=realuser&password=realpassword而无需第二次提供真实的登录信息

完全不是说这是您的错(作为开发人员,我经常遇到您的实际情况),但是这里的某个人似乎在某处过度了。问题在于如何查明在何处使用所获得的工具和访问权限,以及如何做(如果有的话)。

为什么服务器可能会这样做,最简单的解释是:服务器或其前面的某些缓存系统会剥离额外的参数。因此,您可以根据自己的喜好询问id = x273y3,该信息永远不会到达服务器,也无法使其做任何事情。知道用例是什么会很有趣。

在某些有限的情况下,您可能会通过丑陋的操作来完成它-如果您请求12345/../img.png而不是img.png,并且路径解析是以正确的方式完成的,则缓存层可能不会缓存请求,但服务器仍会使用较新的映像进行回复。但这是一个易碎攻击,因为服务器体系结构中的许多合法更改都可能最终完全破坏了它,从而导致根本没有图像被发送。

如果要与服务器端缓存进行斗争,那么最好尝试添加适当的no-cache pragmas to the request本身。许多人使用额外的参数hack的原因是,由于客户端长期以​​来的滥用,可以并且经常将多个缓存服务器配置为忽略这些标头。

特别是如果有人深入研究了参数剥离,那么他们应该努力地正确支持缓存指令。

(另一方面,如果您拥有一台忽略两者合法标头并请求黑客入侵的服务器,那么很可能会发生任何事情)。

否则,可能发生的情况是 client 认为它可以缓存资源,因为该资源是通过特定的资源标头(例如ETag等)发送的,并且由于以下原因,缓存重新验证未正确完成客户端/服务器不理解,这种情况也经常发生。您应该记录一整套对话并将其发布在此处,以帮助解决问题:

  • 对图像的第一个请求的标题
  • 回复标题
  • 对同时更改的图像的请求标头
  • 回复标题

这也可能是非常简单的事情,例如,服务器实际上以固定的302答复,该固定的302剥离了额外的参数。然后就是要缓存的新URL:

GET /get?img.png&...    302位置:http://static-images.server.com/images/img.png

这可能是由于Apache Server重写引擎执行的重写规则过于彻底,例如,其中从源请求中获取“ \?(。*。(png | jpg | gif))”并将其重写为“ NewLocation / $ 1”。在这种情况下,另一个易碎解决方法是请求带有两个?的/get?img.png?t=12345.png,诱使重写引擎捕获img.png?t = 12345而不是img,因此包括缓存清除。

但是,适当的补救措施(如果需要更长的话)是让重写人员和缓存人员彼此交谈并进行协作,而不是相互矛盾。