Apache/CGI
外观
< Apache
CGI (通用网关接口) 是一种标准,它允许 Apache 执行一些程序,这些程序可以用任何编程语言编写 (Bash, C, Java, Perl, PHP, Python...),只要它可执行并符合某些输入/输出约束。
为了使 Apache 解释脚本,需要在站点配置中进行一些设置。
指令(来自 httpd.conf)
ScriptAlias /cgi-bin/ ''/scripts path/''
指定 Apache 允许执行 CGI 脚本的文件夹名称。 [1]
Unix 示例
ScriptAlias /cgi-bin/ /var/www/cgi-bin
Windows 示例,使用 URL 格式(没有反斜杠)
ScriptAlias /cgi-bin/ "C:/wamp/bin/apache/apache2.2.27/cgi-bin/"
实际上,路径 /cgi-bin/
并不真正存在,它被重定向到由指令设置的脚本路径,并且它允许编写一些类似 http://server/cgi-bin/my_script
的 URL。
以下子句在 /var/www/cgi-bin
中激活选项 ExecCGI
,这将授权 Apache 在服务器上执行一些脚本
<Directory /var/www/cgi-bin>
Options ExecCGI
</Directory>
例如,如果一个脚本名为 essai.cgi
位于 /home/httpd/cgi-bin
中
<Directory /home/httpd/cgi-bin>
Options ExecCGI
</Directory>
然后,调用 URL:http://serveur/cgi-bin/essai.cgi
此子句允许选择将被授权的文件扩展名,例如
AddHandler cgi-script .cgi .exe .pl .py .vbs
在 Apache 配置中,Windows 上的完整示例
ScriptAlias /cgi-bin/ "E:/www/cgi-bin/"
<Directory "E:/www/cgi-bin/">
Options FollowSymLinks Indexes
AllowOverride All
Order deny,allow
Allow from all
Require all granted
</Directory>
在 E:/www/cgi-bin/.htaccess
中
AddHandler cgi-script .cgi .exe .pl .py .vbs
主要约束与程序输出有关。如果 CGI 脚本在其标准输出上生成一些数据,它必须在之前显示一个 HTTP 头,以便识别它们。
#!/bin/bash
# Header
echo "Content-type: text/html"
# Header end
echo ""
# Content to display in the navigator
echo "<html><body>Hello World!</body></html>"
此脚本生成一个 HTML 页面。
#!c:/perl/perl/bin/perl.exe -w
use CGI;
my $query = new CGI;
my $Name = $query->param('Name');
print $query->header();
print "Hello World!"
#!C:\Program Files (x86)\Python\python.exe
# -*- coding: UTF-8 -*-
print "Content-Type: text/plain;charset=utf-8"
print
print "Hello World!"
适用于 Windows。 [2]
'!c:/windows/system32/cscript //nologo
Wscript.Echo "Content-type: text/html" & vbLF & vbLF
WScript.Echo "Hello World!"
Wscript.Quit 0
- 错误 500 服务器错误!: 将
Deny from all
替换为Allow from all
。
或
# setsebool -P httpd_enable_cgi 1 # chcon -R -t httpd_sys_script_exec_t cgi-bin/your_script.cgi
- 错误 403 禁止访问: 无法列出此文件夹,因此直接调用其文件。
- 如果文件源代码出现在浏览器中:.htaccess 设置不正确。
- 无法创建子进程: 替换 shebang 之后的路径。例如
#!/usr/bin/perl
替换为#!c:/perl/perl/bin/perl.exe -w
。#!/usr/bin/env python
替换为#!C:\Program Files (x86)\Python\python.exe
。
- 脚本输出结束前出现标题: 缺少标题(例如:将导入移动到
print "Content-Type: text/plain;charset=utf-8"
之前)。但也可能是脚本语言中编译错误的症状。 - 脚本中的格式错误的标题:错误的标题: : 标题不适合(例如:如果之后有
print "<html>"
,则将#print "Content-Type: text/plain;charset=utf-8"
替换为print "Content-type: text/html\n\n"
)。
否则,请查看 Apache 日志...