You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS App Runner部署Django:S3静态资源URL缺失冒号致404错误

Django部署到AWS App Runner后,S3静态资源URL缺失协议冒号导致404

问题现象

静态资源加载时URL协议后缺失冒号,示例如下:

<link rel="shortcut icon" type="image/png" href="https//django-examplebucketname.s3.amazonaws.com/static/images/favicon.png">

导致CSS、JS等所有静态资源返回404。本地使用Whitenoise配置可正常运行,部署到AWS App Runner后问题出现。

已做排查

  • S3桶权限正常,直接访问资源URL可正常打开
  • 手动修改STATIC_URL配置
  • 尝试重写static模板方法
  • 配置FORCE_SCRIPT_NAME和使用get_static_prefix
  • 反复核对所有settings.py配置项的正确性

解决方案

1. 升级django-storages版本

部分旧版本的django-storages在处理AWS_S3_URL_PROTOCOL时存在逻辑bug,建议升级到最新稳定版:

pip install --upgrade django-storages

2. 修正AWS_S3_URL_PROTOCOL配置

确保AWS_S3_URL_PROTOCOL的值包含完整的://后缀,修改settings.py:

AWS_S3_URL_PROTOCOL = "https://"

同时可以让存储类自动生成STATIC_URL,避免手动配置出错:

# 注释掉原手动配置的STATIC_URL
# STATIC_URL = "https://django-examplebucketname.s3.amazonaws.com/static/"
STATIC_URL = f"{AWS_S3_URL_PROTOCOL}{AWS_S3_CUSTOM_DOMAIN}/{AWS_LOCATION}"

3. 自定义存储类强制修复URL

如果上述方法无效,创建自定义存储类手动修正URL格式:
在项目目录下新建storages.py文件:

from storages.backends.s3boto3 import S3Boto3Storage

class CustomS3Storage(S3Boto3Storage):
    def url(self, name):
        url = super().url(name)
        # 检测并修复缺失冒号的问题
        if url.startswith("https//"):
            return url.replace("https//", "https://")
        elif url.startswith("http//"):
            return url.replace("http//", "http://")
        return url

然后修改settings.py中的存储类配置:

STATICFILES_STORAGE = "your_app_name.storages.CustomS3Storage"

4. 检查App Runner环境变量

确认App Runner的环境变量中没有覆盖AWS_S3_URL_PROTOCOL或STATIC_URL,避免部署时配置被错误替换。

5. 重新收集静态文件

部署前执行静态文件收集命令,确保S3中的资源路径和URL配置一致:

python manage.py collectstatic --noinput

内容的提问来源于stack exchange,提问作者junjei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:02:37