XAMPP 默认未启用 mod_cgi 或 mod_cgid 模块,需手动取消 httpd.conf 中 LoadModule cgi_module 或 cgid_module 的注释,并配对 ScriptAlias 与 Directory 块授权 +ExecCGI,否则会报 403 或 500 错误。

Apache 是否已启用 mod_cgi 模块
XAMPP 默认不启用 CGI 支持,哪怕你装了 Python 也没用。关键不是 Python 装在哪,而是 Apache 能不能 fork 子进程去跑 .py 脚本。打开 httpd.conf(Windows 在 C:\xampp\apache\conf\httpd.conf,Linux 在 /opt/lampp/etc/httpd.conf),搜索这行:
LoadModule cgi_module modules/mod_cgi.so
如果前面有 #,必须删掉;若整行不存在,说明你的 XAMPP 版本(如 8.2+)可能默认用 mod_cgid,那就改用:
LoadModule cgid_module modules/mod_cgid.so
注意:mod_cgi 是单进程模型,mod_cgid 是多进程守护模式,后者更稳定,但需配套的 ScriptAlias 和 <directory></directory> 配置。
ScriptAlias 和 <directory></directory> 权限是否配对生效
只写 ScriptAlias /cgi-bin/ "/opt/lampp/cgi-bin/" 不够——Apache 会拒绝执行,报 403 Forbidden 或 500 Internal Server Error。必须紧跟着加一个匹配路径的 <directory></directory> 块:
立即学习“Python免费学习笔记(深入)”;
<Directory "/opt/lampp/cgi-bin/">
AllowOverride None
Options +ExecCGI
Require all granted
</Directory>
Windows 用户注意路径写法:用正斜杠或双反斜杠,例如 "C:/xampp/cgi-bin/" 或 "C:\xampp\cgi-bin\";旧版 Apache(如 XAMPP 7.4)仍用 Order allow,deny + Allow from all,别硬套新语法。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
常见错误:
- 路径字符串末尾多空格或引号不闭合
-
Options +ExecCGI漏写(仅ScriptAlias不赋予执行权) - 目录路径和
ScriptAlias中的物理路径不一致
Python 脚本的 #! 行与权限是否正确
脚本第一行必须是有效的 shebang,且指向真实存在的 Python 解释器路径。Windows 下虽不依赖 chmod,但 Apache 仍会校验该行是否可解析:
- Windows 示例:
#!C:/Python39/python.exe(路径中不能含空格,否则要加引号;推荐把 Python 装在C:/Python39这类无空格路径) - Linux/macOS 示例:
#!/usr/bin/env python3或#!/usr/bin/python3 - 脚本必须以
\n\n结尾的空行分隔 HTTP header 与 body,否则返回500 - Linux/macOS 下还需
chmod +x hello.py,否则 Apache 拒绝执行
浏览器访问时出现 bad file descriptor 或 unknown interpreter,基本就是 #! 路径错了,或 Python 解释器本身不可执行(比如权限被系统策略拦截)。
为什么用 AddHandler cgi-script .py 容易失败
很多教程教你在 <directory></directory> 里加 AddHandler cgi-script .py,但这只是“告诉 Apache 把 .py 当 CGI 处理”,不解决根本问题。它依赖于模块已加载、目录已授权、脚本有 shebang、解释器存在且可调用——任一环节断链,就直接 500。
更稳妥的做法是:坚持用 /cgi-bin/ 路径托管所有 CGI 脚本,并确保该目录受 ScriptAlias 映射和 <directory></directory> 显式授权。不要试图让 /htdocs/ 下任意目录都跑 CGI,那是安全隐患,也是 Apache 2.4+ 默认禁止的。
最后提醒:XAMPP 的 error_log(位于 apache/logs/error_log)永远是你最该先看的日志。500 错误几乎每一条都带具体原因,比如 couldn't spawn child process 或 Permission denied,比浏览器提示有用十倍。

















