apache 执行 .py 文件需同时启用 mod_cgi、配置 addhandler cgi-script .py、设置 options +execcgi、确保脚本首行解释器路径绝对正确且有效、输出合法 http 头,缺一即报 500 错误。

Apache 默认不执行 .py 文件,必须显式启用 CGI 模块、声明可执行扩展名、配置目录权限,并确保脚本首行的解释器路径绝对正确——缺一不可,否则必报 500 错误。
确认 mod_cgi 已加载且未被注释
打开 XAMPP\apache\conf\httpd.conf,搜索 mod_cgi.so。关键不是“有没有”,而是“是否启用”:
-
LoadModule cgi_module modules/mod_cgi.so这一行前面不能有# - 如果使用的是 Apache 2.4+(XAMPP 7.4+ 默认),
mod_cgid.so是替代方案,但 XAMPP 通常仍用mod_cgi.so;混用会导致 CGI 不触发 - 改完必须重启 Apache,仅重载配置(如 via XAMPP Control Panel 的 “Restart”)不够,有时需完全 stop → start
AddHandler 必须显式包含 .py 扩展名
在 httpd.conf 中找到 AddHandler cgi-script 行(通常在 ifmodule alias_module 块内),把它改成:
AddHandler cgi-script .cgi .pl .py
注意:.py 必须加在末尾,不能漏掉点号;大小写敏感,.PY 或 .Py 无效;若同时想支持无扩展名脚本,需额外加 Options +ExecCGI 并配合 ForceType application/x-httpd-cgi,但不推荐初学者这么做。
ScriptAlias 目录下的 .py 文件必须有可执行权限且首行解释器路径有效
默认 CGI 目录是 XAMPP\cgi-bin。放进去的 hello.py 必须满足三项硬性条件:
- 第一行是
#!开头的绝对路径,例如#!C:/Python39/python.exe(Windows)或#!/usr/bin/env python3(Linux/macOS);路径中不能含空格或中文,C:/Program Files/Python39/python.exe会失败 - 文件保存为 UTF-8 无 BOM 格式;带 BOM 会导致
Content-type头输出前多出乱码,触发 500 - 脚本必须输出合法 HTTP 头:至少一行
Content-type: text/html后跟一个空行(\n\n),少一个换行就是 500
Directory 配置中 Options +ExecCGI 和 Require 权限必须匹配
仅靠 AddHandler 不够,目录本身必须允许执行 CGI:
<directory>
AllowOverride None
Options +Indexes +FollowSymLinks +ExecCGI
Require all granted
</directory>
重点看三处:
-
+ExecCGI前面的加号不能丢,写成Options Indexes FollowSymLinks ExecCGI会失效 - Apache 2.4 要求用
Require all granted,不是旧版的Allow from all;混用会导致 403 - 路径字符串必须与
ScriptAlias定义的路径完全一致,包括斜杠方向和结尾斜杠(Windows 下通常不强制,但建议统一用正斜杠)
最容易被忽略的是脚本首行解释器路径的“实时有效性”:哪怕你昨天还能跑,今天重装 Python 或移动了安装目录,#! 行没同步更新,500 就立刻回来——它不报“找不到 python.exe”,只报“Internal Server Error”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











