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
相关产品推荐
相关产品推荐

