CGI跟我学

第一部分

我能用CGI脚本吗?

  在你使用CGI脚本之前,有两件事你也许要解决:CGI脚本 是个高级的Web特性并且需要你拥有与Web 服务器管理者一样棒的知识。

  肯定吗?就是做不到,学学也可以?好吧!让我们继续.

 

你的服务器配置允许CGI脚本吗?

  为了能编写和运行CGI脚本, 你需要一个Web服务器. 不象通常静态的HTML文件, 你不能在本地系统上编写或试验你的CGI脚本; 你得通过Web服务器来做这个.

  但是即使你有一个Web服务器, 这个服务器必须特别地为运行CGI脚本配置一下. 那意味着你所有的脚本必须放置在一个叫做cgi-bin的目录下.

  在编写CGI脚本之前, 需要询问你的服务器管理者是否允许你安装和运行CGI脚本, 并且如果可以的话,他们必须放置在哪儿?还有,你必须有个真正的Web服务器,如果是FTP或Gopher服务器,那你就不能用CGI.

  如果你在自己的服务器上运行, 你必须特别地创造一个叫cgi-bin的目录,并配置你的服务器认可这个目录为一个脚本目录. 也必须记住下面有关CGI脚本特点:

  • 每个脚本是个程序, 它运行在浏览器可以请求的系统上, 执行时使用CPU时间和内存. 如果有成打上千的这些脚本同时运行,会怎样?你的系统将不忍负载直至崩溃。

  • 如果你不仔细地编写你的CGI脚本, 你将有可能让别人通过你的CGI脚本参数进入伤害你的系统.

你会编程吗?  

  初学者注意! 一般地, 你必须具备一些基本编程概念与方法。你必须有类似系统工作的经验。如果你没有这些背景, 你必须去学习,好了,费话不多说.

 

你必须用什么编程语言?

  你可以用你熟悉的任何语言编写CGI脚本, 只要你的脚本遵守下一节所陈列的规则即可,只要那个语言能在你的Web服务器系统上运行.

  在这本学习手册中,仅用两种语言编写CGI脚本: UNIX shell和 Perl语言. 这个shell是适合在任何相近的UNIX系统上运行并且容易学习, 但是处理复杂的情况就困难了. Perl是免费的, 这个语言特点是稳定和强大的,类似C,但它也是较难学习的.

你的服务器设置正确了吗?

  为了运行任何一个CGI脚本, 不管简单或复杂的,你的服务器必须设置成能够运行他们,必须放置在一个特定的目录,必须有一个依赖你服务器设定的文件扩展名.

  如果你是租用服务器,就要是否允许运行CGI脚本.

  如果你拥有自己的服务器,检查你的服务器说明书是怎样处理CGI脚本的.

 

如果你用的不是UNIX?

只好再找别的学习手册了。

 

解剖一个CGI脚本  

  如果你编写它很久,克服很多警告和配置,恭喜你,你已经会些CGI脚本,并且可以在你的网页使用了. 在这一章,将学习脚本是怎样执行,你的服务器又是怎样与他们对话产生回应的。

 

输出头部

  虽然你的CGI脚本可以让你做任何事情,但是脚本的输出还是必须有一个规定形式.

  这个 "脚本输出" 意思是指你的脚本发回服务器的数据. 在UNIX系统中, 输出是发向标准输出, 服务器从那儿检测它. 在其他系统和服务器, 你的脚本输出也许不一样了.

  首先,输出头部信息,头部是实际不是文本的一部分,是服务器与浏览器之间的信息协议,你实际看不到。 有三个类型的头部: Content-type, Location, 和Status. Content-type 是最普遍的。

  有关content-type解释可以见有关HTML的说明, 发出text/html特定编码如下:

Content-type: text/html
  在这个例子中,输出数据的类型是text/html; 换句话说, 输出的是个HTML文件.

    表1. 通用格式和content-types.

Format
Content-Type
HTML text/html
Text text/plain
GIF image/gif
JPEG image/jpeg
PostScript application/postscript
MPEG video/mpeg

  注意content-type 后面必须跟一个空行. 如果你没有空行,服务器将无法搞清这个头部在哪里结束。

输出数据  

  你输出的数据应该符合你所规定的content-type; 如果content-type是text/html, 输出安置应该是在HTML. 如果content-type是image/gif, 输出应该是在一个二进制的GIF文件.

 

练习1: 小试试.
  这是个简单的输出日期的简单脚本,这个CGI脚本还检查看看是否已经登陆到Web服务器,并且报告发现了什么。

  调用代码这样:

<A HREF="/cgi-bin/pinglaura">Is Laura Logged in?</A>
  这是没有输入的脚本,它只运行并且返回数据.

  pinglaura脚本内容是这样::


#!/bin/sh

echo Content-type: text/html

echo "<HTML><HEAD>"

echo "<TITLE>Is Laura There?</TITLE>" 

echo "</HEAD><BODY>"
为了测试是否已经登陆系统,用who命令(登陆名假设为lemay), 储存结果在变量ison中. 如果登陆, 变量ison将有些登录内容,否则是空的.

ison='who | grep lemay'
  试验结果及返回相应提示的脚本是这样:
if [ ! -z "$ison" ]; then
        echo "<P>Laura is logged in."</P>
else
        echo "<P>Laura isn't logged in."</P>
fi
  最后关闭HTML:
  echo "</BODY></HTML>"
  现在你通过从命令行运行这个脚本,测试一下,你将得到一个结果说XXX未登陆你的系统,输出是这样的:
Content-type: text/html

<HTML><HEAD>

<TITLE>Are You There?</TITLE>

</HEAD><BODY>

<P>Laura is not logged in.

</BODY></HTML>
  这是输出的一个HTML文本,这样你的浏览器能正常显示这内容,因为它是个HTML文件。
 

  现在将它copy到你的服务器的cgi-bin目录下,就可以从浏览器调用执行了,如果你不能访问cgi-bin目录,你必须询问你的服务器管理者,你不能理所当然地自己建立个cgi-bin目录,那没用的。

  这个例子完整的脚本如下:

#!/bin/sh

echo "Content-type: text/html"


echo

echo "<HTML><HEAD>"

echo "<TITLE>Is Laura There?</TITLE>"

echo "</HEAD><BODY>"

ison='who | grep lemay'

if [ ! -z "$ison" ]; then

        echo "<P>Laura is logged in"

else

        echo "<P>Laura isn't logged in"

fi

echo "</BODY></HTML>"

第三部分