XAMPP 可同时支持多端口与 Python CGI,但必须分步独立配置:先在 httpd.conf 顶部添加 Listen 指令(如 Listen 8088),再在 httpd-vhosts.conf 中为每个端口定义完整 VirtualHost 块,且每个块内须显式配置 ScriptAlias、<Directory>(含 Options +ExecCGI 和权限指令)、AddHandler cgi-script .py,并确保 Python 脚本 shebang 正确、输出符合 CGI 规范(含双换行 HTTP 头),否则将触发 404 或 500 错误。

XAMPP 能同时支持多端口 + Python CGI,但必须分两步独立配置:先让 Apache 监听多个端口,再确保每个端口对应的 <VirtualHost> 都显式启用 ExecCGI 和正确的 AddHandler。漏掉任一环节,.py 脚本在非 80 端口下会直接 404 或 500。
Listen 指令和 VirtualHost 必须成对出现
只在 httpd.conf 顶部加 Listen 8088 不够——Apache 不知道该把 8088 的请求路由给谁。你得在 httpd-vhosts.conf 里为每个新端口写一个完整的 <VirtualHost *:8088> 块。
-
ServerName可以都设为localhost,只要DocumentRoot和<Directory>路径不同即可 - 每个
<VirtualHost>内部必须包含独立的<Directory>配置,不能复用全局设置 - Mac/Linux 用户注意路径中不要混用反斜杠;Windows 用户若用
C:/xampp/htdocs/py8088,需确保所有斜杠是正斜杠或双反斜杠
每个 VirtualHost 都要单独开 ExecCGI 权限
很多人只在默认 80 端口的 <Directory> 里加了 Options +ExecCGI,结果访问 http://localhost:8088/cgi-bin/test.py 时返回 500 错误,日志里是 End of script output before headers —— 实际是权限没生效。
- 必须在每个
<VirtualHost *:8088>内部嵌套对应的<Directory "/opt/lampp/htdocs/py8088">(或 Windows 下对应路径) - 该
<Directory>块里要明确写Options +ExecCGI和Require all granted(XAMPP 8.2+)或Order allow,deny && Allow from all(旧版) - 如果想统一用
/cgi-bin/,则每个<VirtualHost>都要配一遍ScriptAlias /cgi-bin/ "/opt/lampp/cgi-bin/"+ 对应的<Directory "/opt/lampp/cgi-bin/">
AddHandler .py 必须全局或每个 VirtualHost 单独声明
AddHandler cgi-script .py 如果只写在主配置段,它不会自动继承到 <VirtualHost> 里。Apache 2.4 默认不向下继承 AddHandler。
立即学习“Python免费学习笔记(深入)”;
- 推荐做法:在每个
<VirtualHost>块顶部加一行AddHandler cgi-script .py - 或者,在主配置段(
httpd.conf末尾或httpd-cgi.conf)中加,但必须确认该文件被Include且未被<VirtualHost>隔离 - 别写
AddHandler cgi-script .cgi .py就完事——如果.cgi已有其他 handler(比如 Perl),可能冲突;建议按需精确指定
Python 脚本的 shebang 和输出格式不能出错
即使 Apache 配置全对,.py 文件本身出问题也会导致 500。常见错误不是端口或权限,而是脚本第一行和输出头。
- Windows 下 XAMPP 自带 Python,shebang 应写成
#!C:/xampp/python/python.exe(路径以 XAMPP 安装位置为准,用正斜杠) - Linux/macOS 下,若用系统 Python,
#!/usr/bin/env python3更可靠;但 XAMPP 自带的 Perl 在/opt/lampp/perl/bin/perl,Python 同理查/opt/lampp/python/bin/python - 必须输出完整 HTTP 头:
print("Content-type: text/html\n")(注意结尾两个换行符),不能少\n,也不能有多余空行或 BOM - 脚本保存为 UTF-8 无 BOM 格式;Windows 记事本默认带 BOM,建议用 VS Code 或 Notepad++ 重存
真正容易被忽略的是:每个端口都是独立的 Apache 请求上下文,ExecCGI、AddHandler、ScriptAlias 这三者缺一不可,且必须在同一作用域内生效。改完配置后,务必用 sudo /opt/lampp/lampp restart(Linux/macOS)或重启控制面板(Windows),再查 error_log——90% 的“跑不通”问题,日志里第一行就写了根本原因。


















