Apache2+WSGI环境下子目录部署Django的静态URL配置问题
Apache子目录部署Django:静态文件404问题解决配置
1. 调整Django项目核心配置
修改项目根目录下的settings.py:
- 添加
FORCE_SCRIPT_NAME = '/<subdirectory>',明确告诉Django它部署在指定子目录下,所有生成的URL都会自动带上这个前缀。 - 修改
STATIC_URL = '/<subdirectory>/static/',让静态文件的URL路径和部署结构匹配。 - 确认
STATIC_ROOT配置正确,这是收集静态文件的目标目录:
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
执行命令收集所有静态文件到STATIC_ROOT:
python manage.py collectstatic
2. 配置Apache虚拟主机
打开你的Apache站点配置文件(比如/etc/apache2/sites-available/your-site.conf),做两处关键配置:
- 绑定WSGI应用到子目录:
WSGIScriptAlias /<subdirectory> /<projectpath>/<projectname>/wsgi.py WSGIPythonPath /<projectpath>
- 直接让Apache处理静态文件请求,跳过Django,提升性能同时避免路径问题:
Alias /<subdirectory>/static/ /<projectpath>/staticfiles/ <Directory /<projectpath>/staticfiles/> Require all granted </Directory>
注意要保证Apache对staticfiles目录有读取权限。
3. 规范模板中的静态文件引用
模板里的静态文件引用必须用Django提供的static标签,不要硬写绝对路径:
{% load static %} <link rel="icon" href="{% static '<appname>/img/favicon.png' %}">
这样生成的URL会自动带上/<subdirectory>/前缀,和部署路径对齐。
4. 检查多语言路由(针对示例中的/en/前缀)
你的请求URL包含/en/多语言前缀,要确保i18n中间件在settings.py的MIDDLEWARE列表中,且LOCALE_PATHS配置正确。另外,Django的i18n_patterns默认不会拦截静态文件请求,只要STATIC_URL设置正确,静态文件就不会被多语言路由干扰。
最后重启Apache让配置生效:
sudo systemctl restart apache2
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

