scriptalias 是专为 cgi 设计的独立指令,需置于 virtualhost 内、路径末尾带斜杠、物理路径为绝对路径且非 documentroot 子目录,并配合 directory 块严格限制权限;python 脚本需正确 shebang、http 头和文件权限,禁用 addhandler 全局启用 cgi 等高危操作。

ScriptAlias 不是 Alias 的增强版,而是专为 CGI 设计的独立指令——它既做 URL 映射,又自动赋予执行上下文,比在普通目录里加 Options +ExecCGI 更安全、更可靠。
ScriptAlias 必须放在 VirtualHost 内部
它只对所属虚拟主机生效,不能写在主配置全局区。否则所有站点都可能意外启用该 CGI 路径,带来越权风险。
- 正确位置:嵌套在
<virtualhost></virtualhost>或<virtualhost></virtualhost>块中 - URL 路径末尾必须带斜杠:
ScriptAlias /cgi-bin/ "/var/www/example.com/cgi-bin/"(/cgi-bin无效) - 物理路径必须是绝对路径,且不能是 DocumentRoot 的子目录(如
/var/www/example.com/下再建cgi-bin就不推荐)
搭配 Directory 块收紧权限边界
ScriptAlias 只负责“映射+标记”,真正控制谁能执行、怎么执行,靠的是紧随其后的 <directory></directory> 配置。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
AllowOverride None:禁止 .htaccess 覆盖,防止用户绕过限制 -
Options +ExecCGI:仅启用 CGI 执行,不加+Indexes或+FollowSymLinks -
Require all denied开头,再用Require ip 127.0.0.1或Require local精准放行(生产环境建议限制来源)
Python 脚本运行三要素缺一不可
Apache 不检查脚本内容,但任意一项出错都会返回 500 错误或 “Premature end of script headers”。
-
Shebang 行准确:Linux/macOS 写
#!/usr/bin/env python3,Windows 写#!C:/Python39/python.exe;路径必须真实存在,且 Apache 进程用户(如 www-data)有执行权限 -
输出合法 HTTP 头:首行必须是
Content-type: text/html,后紧跟一个空行(即两个换行符\n\n) -
文件权限合理:脚本需
chmod 755,目录避免 777;SELinux 启用时需确认 context(如chcon -t httpd_exec_t script.py)
避开常见高危操作
很多 500 错误和安全隐患,其实源于看似省事的配置习惯。
- 不用
AddHandler cgi-script .py在 DocumentRoot 下启用 CGI——这会让整个目录下所有 .py 文件都可执行,极易被上传恶意脚本利用 - 不把 ScriptAlias 指向用户可写目录(如
/var/www/uploads/),防止脚本被篡改或替换 - 不混用
mod_cgi.so和mod_cgid.so,XAMPP 等集成环境默认用前者,强行切换会导致 CGI 完全不触发










