如何在Apache共享主机上为Django 1.11.4提供媒体文件服务?
解决Django 1.11.4在Apache共享主机上的媒体文件服务问题
嘿,我来帮你搞定这个困扰!共享主机上部署Django媒体文件确实容易踩坑,尤其是把Debug切到False之后,Django就不再帮你处理静态/媒体文件了,得让Apache直接接手才行。结合你的情况,我给你整理一套针对性的步骤:
第一步:确认Django基础配置没问题
先再核对下你的settings.py里的媒体相关配置,务必用绝对路径(这是最容易出错的点!):
import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # 媒体文件在服务器上的本地绝对路径 MEDIA_URL = '/media/' # 前端访问媒体文件的URL前缀
另外,urls.py里原来的static()辅助函数不用删,它只会在Debug=True时生效,生产环境自动失效,刚好符合我们的需求。
第二步:给媒体文件夹设置正确权限
共享主机里,媒体文件夹(media/)和里面的上传文件必须让Apache服务器能读取。一般设置文件夹权限为755,文件权限为644就行。你可以通过主机控制面板的文件管理器或者SSH命令(如果有权限的话)来修改:
chmod 755 /path/to/your/project/media chmod 644 /path/to/your/project/media/*
第三步:配置Apache直接服务媒体文件
这是核心步骤!因为是共享主机,你大概率没法修改全局Apache配置,所以用.htaccess文件来实现就行:
- 在你的项目根目录(或者主机指定的
public_html/www这类网站根目录)创建.htaccess文件(如果已经存在就直接编辑)。 - 添加以下规则,注意把
/path/to/your/project/media/换成你服务器上的绝对路径(比如/home/yourusername/yourproject/media/,可以通过主机控制面板的文件路径查看,或者用pwd命令在SSH里获取):
# 让Apache直接处理/media/路径的请求 Alias /media/ /path/to/your/project/media/ # 确保媒体目录的访问权限,同时禁止目录列表提升安全性 <Directory /path/to/your/project/media/> Require all granted Options -Indexes </Directory>
如果你的主机用的是mod_wsgi,不用担心冲突——.htaccess里的Alias规则会优先匹配请求,不会让WSGI脚本拦截媒体文件的访问请求。
第四步:测试验证
把settings.py里的Debug改成False,如果主机支持的话重启Apache(或者等主机自动刷新配置),然后访问一个你已经上传的媒体文件,比如http://yourdomain.com/media/test.jpg。如果能直接打开,就说明配置成功了!
常见坑点提醒
- 绝对路径错误:一定要保证
MEDIA_ROOT和.htaccess里的路径完全一致,差一个字符都不行!可以在Django shell里执行print(MEDIA_ROOT)来确认。 - 权限不足:如果访问媒体文件时出现403错误,大概率是权限没设置对,再检查下文件夹和文件的权限。
- 浏览器缓存:有时候浏览器会缓存旧的错误响应,按
Ctrl+F5强制刷新试试。
内容的提问来源于stack exchange,提问作者Ehsan Hasannia
相关产品推荐
相关产品推荐

