Mik*_*ike 15 caching amazon-s3 amazon-web-services http-headers amazon-cloudfront
对于我的网络应用程序中的JPEG图像传递,我正在考虑使用Amazon S3(或亚马逊Cloudfront,如果它是更好的选择),但有两个,可能是相反的要求:
我想的方法是:
is HTTP 307 best ?)重定向到已签名的Cloudfront URLCache-Control max-age=31536000, private"我想到的问题是,下次加载页面时,浏览器将查找www.myserver.com/the_image,但其缓存将用于签名的Cloudfront URL.由于到期时间非常短,我的服务器将第二次返回不同的签名Cloudfront URL,因此浏览器不会知道它可以使用其缓存.
如果没有我的网络服务器代理来自Cloudfront的图像(这显然否定了使用Cloudfront的所有好处),有没有办法解决这个问题?
想知道是否有可以做的事情etag,HTTP 304但不能完全加入点......
总而言之,您拥有私有图像,您希望通过签名网址通过Amazon Cloudfront提供非常短的过期日期.然而,虽然特定URL的访问可能是时间限制的,但是期望即使在URL到期之后客户端也在后续请求上从高速缓存提供图像.
不管客户端如何到达CloudFront的URL(直接或经由一些服务器重定向),该图像的客户机高速缓存将仅与用于请求图像(而不是任何其他URL)的特定URL相关联.
例如,假设您的签名网址如下(为了示例目的,缩短了到期时间戳):
http://[domain].cloudfront.net/image.jpg?Expires=1000&Signature=[Signature]
Run Code Online (Sandbox Code Playgroud)
如果您希望客户端从缓存中受益,您必须将其发送到相同的URL.例如,您不能将客户端指向以下URL并期望客户端使用来自第一个URL的缓存响应:
http://[domain].cloudfront.net/image.jpg?Expires=5000&Signature=[Signature]
Run Code Online (Sandbox Code Playgroud)
目前没有任何缓存控制机制来解决这个问题,包括ETag的,因人而异,等客户端缓存的网页上的性质是,在缓存中的资源与URL相关联,而其他机制的目的是为了帮助客户端确定何时由特定URL标识的资源的缓存版本仍然是新鲜的.
因此,您将陷入这样一种情况:要从缓存的响应中受益,您必须将客户端发送到与第一个请求相同的URL.有可能实现这一目标的方法(cookie,本地存储,服务器脚本等),让我们假设你实现了一个.
接下来你必须考虑缓存只是一个建议,即使这样也不是保证.如果您希望客户端将图像缓存并将其提供给原始URL以从缓存中受益,则可能会出现缓存未命中的风险.在URL到期时间之后缓存未命中的情况下,原始URL不再有效.然后,客户端无法显示图像(来自缓存或来自提供的URL).
当到期时间在URL中时,传统缓存无法提供您正在寻找的行为.
由于无法实现所需的行为,您可能会考虑下一个最佳选择,每个选项都需要放弃您需求的一个方面.按顺序我会考虑它们:
如果您放弃短暂的到期时间,则可以使用更长的到期时间并轮换网址.例如,您可以将url expiry设置为午夜,然后为当天的所有请求提供相同的url.您的客户将受益于当天的缓存,这可能比没有更好.明显的缺点是你的网址有效期更长.
如果您放弃内容交付,则可以从服务器提供图像,该服务器会检查每个请求的访问权限.客户端将能够根据需要缓存资源,这可能比内容传递更好,具体取决于缓存命中的频率.这种情况的一种变体是将Amazon CloudFront换成另一个提供商,因为可能有其他内容传送网络支持这种行为(虽然我不知道).内容分发网络的丢失可能是一个缺点,也可能无关紧要,具体取决于您的特定访问者.
如果放弃单个静态HTTP请求的简单性,则可以使用客户端脚本来确定应该进行的请求.例如,在JavaScript中,你可以尝试使用检索原始URL的资源(从高速缓存受益),如果失败(由于高速缓存未命中,安然到期)申请一个新的URL中使用的资源.这种情况的一种变体是使用除浏览器缓存之外的一些缓存机制,例如本地存储.这里的缺点是增加了复杂性并降低了浏览器预取的能力.
| 归档时间: |
|
| 查看次数: |
1495 次 |
| 最近记录: |