我正在使用查询参数(例如:
)从网址来源获取图片www.server.com/get?img.jpg
但是,当服务器更改图像时,由于图像已缓存,我无法获得最新副本。关于stackoverflow的大多数答案都说添加了用于缓存清除的查询参数,但这在这种情况下不起作用。尝试过:
www.server.com/get?img.png&id=1123
有什么想法/建议吗?谢谢
编辑:id =之后的数字是随机的。
答案 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,因此包括缓存清除。
但是,适当的补救措施(如果需要更长的话)是让重写人员和缓存人员彼此交谈并进行协作,而不是相互矛盾。