XAMPP 的 Apache 无法直接启动 Django,因其缺失 mod_wsgi.so 且预编译模块与本地 Python 架构(如 32/64 位)极难匹配,加载必报错;将 Python 文件放入 htdocs 无效,因 Apache 默认仅处理静态文件和 PHP,不识别 Django,还可能导致 SECRET_KEY 泄露。

为什么不能直接用 XAMPP 的 Apache 启动 Django
因为 XAMPP 自带的 Apache 没有 mod_wsgi.so,且预编译模块几乎不可能匹配你本地 Python 的架构(比如 XAMPP 是 32 位、Python 是 64 位),加载时会直接报 Cannot load mod_wsgi.so。把 manage.py 或 wsgi.py 放进 htdocs 目录毫无作用——Apache 默认只处理静态文件和 .php,对 Python 文件完全无感知,还可能因路径暴露导致 settings.py 中的 SECRET_KEY 泄露。
用 Apache 的 mod_proxy 反向代理到 Django 开发服务器
这是最稳定、免编译、兼容性最强的做法:让 Django 自己用 python manage.py runserver 127.0.0.1:8000 跑起来,再让 Apache 把请求转发过去。关键点不在“启动 Django”,而在“让 Apache 正确转发”。
提供使用 django-unfold (v0.56+) 构建高级 Django 管理界面的专业指导。当用户提及 django-unfold、unfold admin 等内容时使用此技能。
- 确保 Apache 已启用
mod_proxy和mod_proxy_http:打开XAMPP\apache\conf\httpd.conf,确认这两行未被注释:LoadModule proxy_module modules/mod_proxy.so、LoadModule proxy_http_module modules/mod_proxy_http.so - 监听额外端口(如
8080):在httpd.conf的Listen 80下追加Listen 8080,避免端口冲突 - 配置虚拟主机时指定
ProxyPass和ProxyPassReverse,例如:<VirtualHost *:8080> ServerName django.local ProxyPreserveHost On ProxyPass / http://127.0.0.1:8000/ ProxyPassReverse / http://127.0.0.1:8000/ </VirtualHost> - 必须在 Windows 的
C:\Windows\System32\drivers\etc\hosts中添加127.0.0.1 django.local,否则浏览器根本解析不了域名
静态文件必须由 Apache 直接提供,不能走代理
Django 开发服务器能服务 /static/,但反向代理模式下,Apache 默认会把所有请求(包括 /static/css/app.css)转发给 Django,造成样式丢失、JS 404。正确做法是让 Apache 绕过代理、直接读磁盘。
- 先运行
python manage.py collectstatic --noinput,确保所有静态文件已合并到STATIC_ROOT(如./staticfiles/) - 在虚拟主机配置中添加
Alias映射,路径必须用正斜杠、结尾带斜杠:Alias /static/ "C:/xampp/htdocs/myproject/staticfiles/" - 紧跟
<Directory "C:/xampp/htdocs/myproject/staticfiles/"> Require all granted </Directory> - 如果 Django 设置了
STATIC_URL = '/assets/',那Alias必须写成Alias /assets/ "...",否则所有静态资源 404
ALLOWED_HOSTS 和 SECURE_PROXY_SSL_HEADER 必须同步调整
代理后,Django 收到的请求 Host 头是 django.local:8080(或 localhost:8080),不再是原始开发服务器的 127.0.0.1:8000。不改配置会直接返回 500 或 400 Bad Request。
- 在
settings.py中,把代理域名加入ALLOWED_HOSTS:ALLOWED_HOSTS = ['django.local', 'localhost'](不要写端口号) - 若通过 HTTPS 代理或需识别真实 IP,需设置:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https'),并确保 Apache 配置中加了RequestHeader set X-Forwarded-Proto "https" - 代理路径不是根路径(如用
/myapp/代理)时,Django 的重定向 URL 会出错,此时必须设FORCE_SCRIPT_NAME = '/myapp/',否则点击 admin 链接会跳到/admin/而非/myapp/admin/
ProxyPass 路径末尾斜杠是否一致、STATIC_URL 和 Alias 是否严格对应、ALLOWED_HOSTS 是否漏掉代理域名——少一个,页面就卡在白屏或 500。

















