S3 上的 Django 静态文件 : S3ResponseError: 301 Moved Permanently

标签 django amazon-web-services amazon-s3

我尝试在 Amazon S3 上托管我的 Django 静态和媒体文件,并且我一直在遵循所有指南,但最终我仍然在部署时收到 S3ResponseError: 301 Moved Permanently 错误当我的 Elastic Beanstalk 应用程序尝试运行 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

这是我想使用的第三个选项,但我也尝试过其他选项。在下面的设置中包含和不包含 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:主机名“s3.condopilot.com.s3.amazonaws.com”与“*.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 中。

最佳答案

我认为您不需要在 URL 中设置区域 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

关于S3 上的 Django 静态文件 : S3ResponseError: 301 Moved Permanently,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29971297/

相关文章:

amazon-web-services - Elastic Beanstalk ssh 说它找不到我的 SSH key 文件

amazon-web-services - 无法从 docker 容器内部连接到 RDS,我可以从主机连接到 RDS,也可以从本地 docker 容器连接到 RDS

amazon-web-services - AWS S3 Golang SDK - 上传文件 - 错误的区域

python-3.x - 使用 python3 构建 sklearn lambda 的 EFL 加载命令错误

reactjs - Django, Djoser 社交身份验证 : State could not be found in server-side session data. status_code 400

amazon-web-services - 如何手动回滚Lambda函数的CloudFormation部署?

python - Django 模板 - 遍历范围

amazon-s3 - 备份到 S3 : symlinks

python - 如何在 Django 模板上实现 "back"链接?

python - 为什么 django_migrations 表在所有数据库中