django-compressor、heroku、s3:请求已过期
Posted
技术标签:
【中文标题】django-compressor、heroku、s3:请求已过期【英文标题】:django-compressor, heroku, s3: Request has expired 【发布时间】:2013-03-29 01:10:41 【问题描述】:我在 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 存储桶。它们还共享相同的设置文件,所有唯一设置都配置为环境变量。我已经检查过静态文件实际上被推送到它们各自的存储桶中。
compressor & 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,只能在请求标头中使用。
【问题讨论】:
检查以确保您的服务器的系统时间已更新 -- 我在运行系统时间未同步的虚拟机时收到此错误。 我在 Heroku 上,无法控制系统时间。 【参考方案1】:试试这个:
AWS_QUERYSTRING_EXPIRE = 63115200
该值是从生成链接开始的秒数。
【讨论】:
这行得通,但你能告诉我们更多关于为什么。这是 Botto 还是 django-compressor 设置?它是否记录在任何地方? 这是一个 boto 设置,默认情况下,boto 将过期查询字符串放在 URL 输出上,但它们相当短。这将有效期延长至两年。我只是通过查看源代码并在互联网上看到一些对它的引用才找到它。【参考方案2】:以防万一有人遇到同样的问题:
AWS_QUERYSTRING_AUTH = False
这将删除任何到期等。根据用例(如我的和许多其他情况)并不总是需要到期。这将允许您删除任何过期。
【讨论】:
实际上更改过期时间的正确方法如威尔金森的回答中所述。 AWS_QUERYSTRING_AUTH = False 禁用 epiration peram,这是针对短到期时间问题的已知解决方法。以上是关于django-compressor、heroku、s3:请求已过期的主要内容,如果未能解决你的问题,请参考以下文章
一起使用 django-storages 和 django-compressor 时尝试压缩静态文件时出错
ENOTFOUND:getaddrinfo ENOTFOUND api.heroku.com api.heroku.com:443 Heroku 创建错误
heroku create ENOTFOUND: getaddrinfo ENOTFOUND api.heroku.com api.heroku.com:443