利用Shell或其他脚本语言在Apache下写CGI


本文从最基本的流程来介绍一下如何配置Apache使其支持CGI,并用Bash和Python写一个Hello World的动态CGI程序。以下的Apache配置以红帽系的Linux为准。

配置Apache

首先需要确认Apache里面的CGI模块已经被载入,一般在/etc/httpd/conf/httpd.conf里面的会有下面这句话:

LoadModule cgi_module modules/mod_cgi.so

然后在httpd.conf里面(一般是最后)加入下面这句话:

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

上面这句的意思就将URI后面的路径/cgi-bin/对应到服务器上的/var/www/cgi-bin/目录。比如说服务器的地址是www.bkjia.com的话,那么www.bkjia.com/cgi-bin/hello.cgi就会对应到/var/www/cgi-bin/hello.cgi。

编写Hello World CGI脚本

接下来我们在/var/www/cgi-bin/目录里面创建一个hello.cgi文件,这个文件我们用Bash来写。在里面输入下面的内容:

#! /bin/bash

echo Content-type: text/html

echo ""

echo Hello, World.

然后修改文件的执行权限使得Apache进程能够执行这个文件。一般用chmod +x hello.cgi就可以。

然后用浏览器打开http://www.bkjia.com/cgi-bin/hello.cgi就可以看到浏览器上面正常的显示Hello, World.了。

注意到上面的输出的第一行必须是输出“Content-type: text/html“否则Apache识别不了这个文本页面的输出。

如果使用Python的话,可以创建一个hello.py文件,输入下面的内容:

#! /usr/bin/python

print("Content-type: text/html\n\n")

print("Hello, World.")

获取脚本的环境变量

一般情况下,我们编写CGI的目的都是动态的处理客户端的请求,而不是显示静态内容。这个时候我们可以通过环境变量来获取相关的值。下面主要是介绍获取通过GET来传递的值。

首先编写如下shell cgi脚本:

#! /bin/bash

echo Content-type: text/html

echo ""

/usr/bin/env  #注意这里设置成env命令的绝对路径,可以通过whereis env来获取

然后在浏览器请求这个cgi就可以看到相关的环境变量。我们也可以看到GET的参数是通过$QUERY_STRING来获取的。

所以在shell的cgi里面,我们就可以通过$QUERY_STRING来获取GET参数。

而在Python里面,则可以通过form的getfirst()函数来获取,具体可以看下面的例子:

#! /usr/bin/python

import cgi    # 导入cgi模块

form = cgi.FieldStorage()  # 获取form对象

var1 = form.getfirst('var1', 'empty')  # form对象已经封装了GET和POST方式的请求,所以两种的参数都可以获取。

相关内容