2015-04-30 52 views
5

我试图在亚马逊S3上托管我的Django静态和媒体文件,并且我一直遵循每个指南,但我仍然在部署时遇到S3ResponseError: 301 Moved Permanently错误我的Elastic Beanstalk应用程序试图运行collectstatic时。S3上的Django静态文件:S3ResponseError:301永久移动

我的S3正在工作,我可以访问其上的其他文件。我也将其设置为自定义域,因此您可以通过以下方式访问同一个文件:

  1. http://s3.condopilot.com.s3-eu-west-1.amazonaws.com/thumbs/big/3fca62e2150e8abec3f693a6eae8d2f79bb227fb.jpg
  2. https://s3-eu-west-1.amazonaws.com/s3.condopilot.com/thumbs/big/3fca62e2150e8abec3f693a6eae8d2f79bb227fb.jpg
  3. http://s3.condopilot.com/thumbs/big/3fca62e2150e8abec3f693a6eae8d2f79bb227fb.jpg

这是我想要的第三个选项使用,但我也尝试了其他的。在下面的设置中有和没有https://

我的设置文件看起来像这样

#settings.py file 
AWS_ACCESS_KEY_ID = 'XXX' 
AWS_SECRET_ACCESS_KEY = 'XXX' 
AWS_HEADERS = { 
    'Expires': 'Thu, 31 Dec 2099 20:00:00 GMT', 
    'Cache-Control': 'max-age=94608000', 
} 
AWS_STORAGE_BUCKET_NAME = 's3.condopilot.com' 
# I have also tried setting AWS_S3_CUSTOM_DOMAIN to the following: 
# - "s3-eu-west-1.amazonaws.com/%s/" % AWS_STORAGE_BUCKET_NAME 
# - "s3-eu-west-1.amazonaws.com/%s" % AWS_STORAGE_BUCKET_NAME 
# - "s3.condopilot.com" 
AWS_S3_CUSTOM_DOMAIN = "%s.s3-eu-west-1.amazonaws.com" % AWS_STORAGE_BUCKET_NAME 
AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat' 
AWS_S3_SECURE_URLS = False # Tried both True and False 
AWS_S3_URL_PROTOCOL = 'http' # Tried with and without 

STATICFILES_LOCATION = 'static' 
STATIC_URL = "http://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION) 
STATICFILES_STORAGE = 'custom_storages.StaticStorage' 

MEDIAFILES_LOCATION = 'media' 
MEDIA_URL = "http://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION) 
DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage' 

我之所以AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat'是因为没有它,我得到以下错误: ssl.CertificateError: hostname 's3.condopilot.com.s3.amazonaws.com' doesn't match either of '*.s3.amazonaws.com', 's3.amazonaws.com'。我在网上找到的关于该错误的所有建议表明,当存储桶名称包含点时应使用OrdinaryCallingFormat,例如s3.condopilot.com

我定制存储器看起来像这样

#custom_storages.py 
from django.conf import settings 
from storages.backends.s3boto import S3BotoStorage 

class StaticStorage(S3BotoStorage): 
    location = settings.STATICFILES_LOCATION 

class MediaStorage(S3BotoStorage): 
    location = settings.MEDIAFILES_LOCATION 

是的,我的S3桶被设置在欧盟 - 西1

+0

我遇到了完全相同的问题。我还没有找到解决方案。 – Sam

+0

我所有的桶都在北加州地区。但是,如果您创建了一个区域为美国标准的新存储区,则带点的存储区名称似乎可行。另一方面,如果存储桶名称中没有点,它将在没有设置调用格式的情况下工作。 – Sam

回答

2

我觉得你并不需要设置区域S3的URL,如果你正在使用Django的存储替换该应用Django的储存 - 终极版。你不需要custom_storages.py文件。

保持简单。这就够了。

from django.utils import six 

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 
AWS_ACCESS_KEY_ID = 'XXXXXXXXXXXXXXXX' 
AWS_SECRET_ACCESS_KEY = 'XxXxXxXxXxXxXxXxXxXxXxXxXxXxxXxX' 
AWS_STORAGE_BUCKET_NAME = 'bucket-name' 
AWS_AUTO_CREATE_BUCKET = False 
AWS_QUERYSTRING_AUTH = False 
AWS_EXPIRY = 60 * 60 * 24 * 7 
AWS_HEADERS = { 
    'Cache-Control': six.b('max-age=%d, s-maxage=%d, must-revalidate' % (
     AWS_EXPIRY, AWS_EXPIRY)) 
} 

MEDIA_URL = 'https://%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME 
STATICFILES_STORAGE = DEFAULT_FILE_STORAGE 
STATIC_URL = MEDIA_URL