9

我在 heroku 上使用 django-compressor 和 amazon s3 提供静态文件,我一直遇到以下错误,因为压缩器生成了指向静态文件的链接。我对压缩机和 s3 完全陌生:

https://xxx.s3.amazonaws.com/static/CACHE/css/989a3bfc8147.css?Signature=tBJBLUAWoA2xjGlFOIu8r3SPI5k%3D&Expires=1365267213&AWSAccessKeyId=AKIAJCWU6JPFNTTJ77IQ

<Error>
<Code>AccessDenied</Code>
<Message>Request has expired</Message>
<RequestId>FE4625EF498A9588</RequestId>
<Expires>2013-04-06T16:53:33Z</Expires>
<HostId>Fbjlk4eigroefpAsW0a533NOHgfQBG+WFRTJ392v2k2/zuG8RraifYIppLyTueFu</HostId>
<ServerTime>2013-04-06T17:04:41Z</ServerTime>
</Error>

我配置了两台heroku 服务器,一台用于登台,一台用于生产。他们每个人都有自己的数据库和 s3 存储桶。它们还共享相同的设置文件,所有唯一设置都配置为环境变量。我已经检查过静态文件实际上被推送到它们各自的存储桶中。

压缩机和s3设置如下:

COMPRESS_ENABLED = True
COMPRESS_STORAGE = STATICFILES_STORAGE 
COMPRESS_URL = STATIC_URL
COMPRESS_ROOT = STATIC_ROOT
COMPRESS_OFFLINE = False

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')

每次我在登台或生产上向 heroku 推送更新时,我最终都会遇到上述问题。有时会在一小时后发生,有时会发生在一天后,有时会发生在一周后,有时会在推出更新后立即发生。奇怪的是,如果我将相同的更新推送到两个环境,一个会起作用,我会在另一个上得到错误,或者它们都将首先起作用,一个会在一小时后过期,另一个会在一周后过期.

如果有人能解释发生了什么,我将不胜感激。显然是 Expires 参数导致了这个问题,但是为什么每次推送都会改变持续时间以及决定时间量的因素是什么?您如何更改到期时间?如果您需要更多信息,请告诉我。

更新:我通过设置 AWS_QUERYSTRING_AUTH = False 暂时解决了这个问题。似乎没有任何方法可以在查询字符串中设置 EXPIRATION TIME,只能在请求标头中使用。

4

2 回答 2

17

试试这个:

AWS_QUERYSTRING_EXPIRE = 63115200

该值是从生成链接开始的秒数。

于 2013-04-14T02:45:01.777 回答
3

以防万一有人遇到同样的问题:

AWS_QUERYSTRING_AUTH = False

这消除了任何到期等。根据用例(如我的和许多其他情况)并不总是需要到期。这将允许您删除任何到期。

于 2014-06-15T20:27:48.427 回答