我正在使用查询参数从url源获取图像:

www.server.com/get?img.jpg

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

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

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

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

最佳答案

在这种情况下,查询参数暗示总是更改。如果仅添加&id=1123,则不会有任何改变。

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

或者,如果您在同一台服务器上生成链接,最好还是使用nnnn的图像修改时间(以秒为单位)或作为时间戳记来用作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的原因是,由于客户端长期以​​来的滥用,可以并且经常将多个缓存服务器配置为忽略那些标头。

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

(另一方面,如果您拥有一台同时忽略合法标头和请求黑客攻击的服务器,则很可能会发生任何事情)。

否则,可能发生的情况是客户端认为它可以缓存资源,因为它是通过特定的资源头(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,从而包括缓存清除。

适当的(如果更长的话)补救措施是使重写人员和缓存人员彼此交谈并协作,而不是费力地工作。

07-24 18:02
查看更多