S3上的Django静态文件:S3ResponseError:301永久移动

时间:2015-04-30 15:06:55

标签: django amazon-web-services amazon-s3

我正在尝试在Amazon S3上托管我的Django静态和媒体文件,我一直在关注每个指南,但是当我在部署Elastic Beanstalk应用程序时,我仍然会收到S3ResponseError: 301 Moved Permanently错误尝试运行collectstatic

我的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
  4. 这是我想要使用的第三个选项,但我也尝试过其他选项。在下面的设置中有和没有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存储桶设置在 eu-west-1

1 个答案:

答案 0 :(得分:2)

我认为您不需要在网址中设置区域S3,如果您使用 django-storage 将此应用替换为 django-storages-redux 。您不需要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