Django项目部署在PythonAnywhere时HTTPS站点CSS文件无法加载问题
Django在PythonAnywhere上HTTPS站点CSS无法加载问题排查
核心原因
- 最普遍的原因是混合内容拦截:浏览器安全策略禁止在HTTPS页面中加载HTTP协议的静态资源,而HTTP页面没有该限制,因此会出现两端表现不一致的情况,通常是Django生成的静态资源URL固定为HTTP协议导致。
- Django未正确识别HTTPS请求:PythonAnywhere通过反向代理实现HTTPS访问,默认配置下Django无法感知当前请求是HTTPS,依然会生成HTTP前缀的静态资源地址,触发混合内容拦截。
- 少数情况为PythonAnywhere站点配置差异:HTTPS站点的静态文件映射规则未和HTTP站点同步配置,导致静态资源路径找不到。
解决方案
- 所有静态资源使用Django模板自带的
{% static %}标签加载,不要硬编码静态资源的完整URL,标签会自动适配当前站点的协议生成对应资源地址。 - 在项目
settings.py中添加如下配置,让Django能正确识别PythonAnywhere反向代理传递的HTTPS请求标识:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
- 如果有硬编码的静态资源地址,可以将HTTP/HTTPS前缀替换为协议相对路径,即
//开头,例如将http://example.com/static/css/main.css改为//example.com/static/css/main.css,浏览器会自动匹配当前页面的协议加载资源。 - 登录PythonAnywhere的Web管理控制台,检查HTTPS站点的静态文件映射配置,确保
/static/对应的目录路径和HTTP站点配置完全一致。
问题场景参考截图


内容的提问来源于stack exchange,提问作者Ishraaq Parvez
相关产品推荐
相关产品推荐

