7

我有一个使用django-compressor压缩我的 CSS 和 JS 文件的 Heroku 设置。我的默认缓存后端是使用 memcached 设置的(在 Heroku 上实际上是 Memcachier)。我的静态文件在 Amazon S3 实例上提供(由django-storages和 boto 处理)。通常,我的设置与django-compressor docs 中的设置一致。

在我的页面中,指向我的压缩文件的链接有一个“过期”查询,似乎是从生成链接开始的一个小时。我不想将所有 CSS 或 JS 请求设置为没有过期,因为我有一些我不压缩的 CSS 和 JS(当我尝试时它给了我错误......可能是一个不同的问题)。

但是,每小时链接中断一次,并且该站点没有更多样式或 JS。看起来链接,或者至少是 expires 标头,正在被缓存而不是重新生成,所以在 expires 参数中的时间过去后,亚马逊不再返回文件。如果我刷新内存缓存,它会将链接中的 expires 标头更改为从那时起一个小时,这将问题修复一个小时,直到它再次过期。

以下是 9 月 18 日星期二美国东部标准时间下午 1:39 左右生成的链接示例:https ://zen180-static.s3.amazonaws.com/CACHE/css/68d31794a646.css?Signature=u%2FTxeF7LBBZTDV79YovOjoK2tcw %3D&Expires=1347993542&AWSAccessKeyId=AKIAIJ7VKLEX7HIMJZCA。首次生成后,该页面将继续提供该链接而无需更改。大约 2:39 EST(即 Unix 时间 1347993542,来自 URL 中的 expires 参数),该链接停止工作并发送回“过期” XML 消息(与现在相同)。但是在我刷新内存缓存之前,我的页面上仍然存在错误链接。

以下是相关设置:

COMPRESS_ENABLED = True

STATICFILES_STORAGE = '[my app's name].storage.CachedS3BotoStorage' (a subclass of S3BotoStorage that is almost identical to the one from django-compressor's docs linked above)

COMPRESS_STORAGE = STATICFILES_STORAGE

COMPRESS_URL = STATIC_URL

CACHES = {
  'default': {
    'BACKEND': 'django_pylibmc.memcached.PyLibMCCache',
    'LOCATION': 'localhost:11211',
    'TIMEOUT': 500,
    'BINARY': True,
  }
}

这是错误:

<Error>
<Code>AccessDenied</Code>
<Message>Request has expired</Message>
<RequestId>81A63F24378ECB5E</RequestId>
<Expires>2012-09-18T18:39:02Z</Expires>
<HostId>lIr5l9Fna95DUfk6hUsWqhO5EQNn6Ayu8BatpEavis8YzLvsaJRru4O8P/50pgMy</HostId>
<ServerTime>2012-09-18T18:59:51Z</ServerTime>
</Error>
4

1 回答 1

2

如果您希望浏览器缓存您的静态内容,请进行settings.AWS_HEADERS相应的设置(如亚马逊最佳实践中所述):

AWS_HEADERS = {
    'Expires': 'Sun, 19 Jul 2020 18:06:32 GMT'
}

如果您确实需要重新生成链接,请找到它存储在 memcache 中的位置,并将您发送给 Amazon 的链接到期时间设置为相同的缓存时间(从django-compressordocs 判断它应该是其中之一settings.COMPRESS_*_DELAY)。

于 2012-09-27T18:04:23.670 回答