跳转到内容

Apache/CGI

来自维基教科书,自由的教科书

CGI 脚本

[编辑 | 编辑源代码]

CGI (通用网关接口) 是一种标准,它允许 Apache 执行一些程序,这些程序可以用任何编程语言编写 (Bash, C, Java, Perl, PHP, Python...),只要它可执行并符合某些输入/输出约束。

配置 CGI 脚本访问权限

[编辑 | 编辑源代码]

为了使 Apache 解释脚本,需要在站点配置中进行一些设置。

ScriptAlias

[编辑 | 编辑源代码]

指令(来自 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

[编辑 | 编辑源代码]

此子句允许选择将被授权的文件扩展名,例如

 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 程序

[编辑 | 编辑源代码]

主要约束与程序输出有关。如果 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 日志...

参考资料

[编辑 | 编辑源代码]
  1. https://httpd.apache.ac.cn/docs/current/en/howto/cgi.html
  2. http://wiki.uniformserver.com/index.php/CGI:_VBScript_CGI
华夏公益教科书