我刚开始在亚马逊的S3上存储用户上传的图像。它非常好,因为它解决了我的存储问题。但是,当浏览器缓存图像时,我正在努力。
我正在使用django-storage。在他们的文档中,他们指定您可以通过在设置中设置AWS_HEADER var将事物放在图像的请求标头上。我这样做并没有结果。
基本上,当应用程序请求图像时,我每次都会得到200个。 ARG ...当我直接将浏览器带到图像上时(将链接复制并粘贴到一个新窗口)我每次都会得到200,然后是304。
这非常令人沮丧,因为它每次都会重新下载图像。有些页面上最多有25个小缩略图,每次重新加载页面时都会重新加载所有内容。
我正在使用djangos staticfiles提供我的静态文件,它们正常工作。文件缓存后,我得到200,然后是304。
这是我在settings.py中的AWS设置
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = '***'
AWS_SECRET_ACCESS_KEY = '***'
AWS_STORAGE_BUCKET_NAME = 'foobar_uploads'
AWS_HEADERS = {
'Expires': 'Thu, 15 Apr 2020 20:00:00 GMT',
'Cache-Control': 'max-age=86400',
}
AWS_CALLING_FORMAT = CallingFormat.SUBDOMAIN
以下是应用请求图片时的请求和响应标题:(我用“ * ”替换了我认为可能是敏感信息的内容)
##request##
GET /user_uploads/*****/2012/3/17/14/46/thumb_a_28_DSC_0472.jpg?Signature=FVR6T%2BXFwHMmdQ9K3n7Ppp7QxoY%3D&Expires=1332023525&AWSAccessKeyId=***** HTTP/1.1
Host: *****_user_uploads_sandbox.s3.amazonaws.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11
Accept: */*
Referer: http://localhost:8000/m/my-photos/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
##response##
HTTP/1.1 200 OK
x-amz-id-2: Hn3S+3gmeLHIjKCpz+2ocE6aPsLCVHh56jJYTsPHwxU98y89x+9X1Ml202evBUHT
x-amz-request-id: 528CEB880CA89AD3
Date: Sat, 17 Mar 2012 21:32:06 GMT
Cache-Control: max-age=86400
Expires: Thu, 15 Apr 2020 20:00:00 GMT
Last-Modified: Sat, 17 Mar 2012 20:46:29 GMT
ETag: "a3bc70e0c3fc0deb974edf95668e9030"
Accept-Ranges: bytes
Content-Type: image/jpeg
Content-Length: 8608
Server: AmazonS3
这里是我通过复制和粘贴链接到图像手动请求图像时的请求/响应标题:
##request##
GET /user_uploads/*****/2012/3/17/14/46/thumb_a_28_DSC_0472.jpg?Signature=FVR6T%2BXFwHMmdQ9K3n7Ppp7QxoY%3D&Expires=1332023525&AWSAccessKeyId=***** HTTP/1.1
Host: porlio_user_uploads_sandbox.s3.amazonaws.com
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
If-None-Match: "a3bc70e0c3fc0deb974edf95668e9030"
If-Modified-Since: Sat, 17 Mar 2012 20:46:29 GMT
##response##
HTTP/1.1 304 Not Modified
x-amz-id-2: FZH0imrbNxziMznhl5zAoo38CaM7Z+TFnd8R6HtTYB3eTmVpCih+1IniKaliRo18
x-amz-request-id: 3CACF77FBB39D088
Date: Sat, 17 Mar 2012 21:33:22 GMT
Last-Modified: Sat, 17 Mar 2012 20:46:29 GMT
ETag: "a3bc70e0c3fc0deb974edf95668e9030"
Server: AmazonS3
我看到有一些差异,例如“If-None-Match:”或“If-Modified-Since:”。我想如果我要设置那些,那么它应该像我想的那样工作。
有一种简单的方法吗?
感谢您的帮助!
编辑1:我读过这篇文章并且无法很好地翻译它。http://coder.cl/2012/01/django-and-amazon-s3/comment-page-1/
答案 0 :(得分:5)
如果您不希望django-storage将auth查询添加到静态媒体,请将以下内容添加到settings.py
:
AWS_QUERYSTRING_AUTH = False
这是由S3 Boto后端引起的,它将自动附加查询字符串,除非指示不通过django-storages。如果您查看应用程序的source code,您会发现它在settings.py
文件中找到了一些额外的未记录的设置(第34行)。
我回应了Github上为django-compressor here提出的类似问题。
答案 1 :(得分:1)
看起来你并没有发送" If-None-Match"或" If-Modified-Since"在您的应用程序请求中,因此S3无法将您发回304,因为它不知道您拥有什么。正如您所看到的,您的浏览器已将文件缓存,因此它会发送这两个标头并获得正确的304响应。
如果您要保留文件的本地副本,则需要存储Last-Modified和/或ETag,并将其与您的图像请求一起发送。
作为相关的一点,我考虑只使用max-age标题并跳过Expires。根据规范,Expires should not be more then a year in the future。同时使用Expires和max-age是多余的,max-age可以设置为相对数量(正如您所做的那样)。
我强烈推荐使用this article on caching及其相关的REDbot工具来检查您的配置。