2004-7-9 5:55:00 作者: 来源:未知 网友评论 0 条
论坛
CGI命令行选项规范
命令行只用在ISINDEX查询的情况。它不使用在HTML表单或者任何没定义的查询类型中。服务器应该为一个没有编码的=字符搜索信息来决定是否命令行被使用了,如果它发现了,命令行就不使用。这个就委托客户端在ISINDEX查询中编码等于号,这个被认为是安全的。
下面举个例子,使用网络命令和ISINDEX界面来观察"httpd"。你将会看到脚本会自动利用/cgi-bin/finger?httpd来调用它本身并且将会在命令行执行"finger httpd" ,还会为你输出结果。
如果服务器没有在QUERY_STRING找到"=" ,那么命令行不会被使用,任何的解码也没有被执行。这个查询利用适当的FORM提交解码器来维持于处理的联系。同时,作为一个例子,可以为提交"httpd=name"使用超级连接到网络指令脚本。因为QUERY_STRING包含了一个未编码的"=",所以没有被解码,这个脚本不知道它提交了一个有效的查询,而只是给你一个缺省的网络指令表单。
如果服务器发现它因为内部限制(比如exec()或者/bin/sh命令行限制)儿不能发送字符串,服务器应该包含NO命令行信息并且提供没有解码的查询信息在环境变量QUERY_STRING中。
CGI脚本输入规范
为了请求哪个有信息附在文件头后面,比如HTTP POST或者PUT,信息将被发送到脚本的stdin中。
服务器将要发送CONTENT_LENGTH 字节到这个文件描述器中。这里记住它还会给出数据的CONTENT_TYPE。服务器有义务在脚本读了CONTENT_LENGTH的字节之后发送文件的结束标识。
CGI 脚本输出规范
脚本发送它的输出到stdout。这个输出可以是有脚本产生的文档,还可以是用于检索输出的服务器的指令。
以下是脚本命名的约定:
通常,脚本产生输出并发送回给客户端。这样做的好处是脚本不需要每一个请求发送一个完整的HTTP/1.0文件头。有些脚本可以想避免服务器解析输出的额外开销,而直接通知客户端。为了从其它脚本中辨认出这些脚本,CGI要求如果脚本不想服务器解析它的文件头,脚本的名字要以nph-开头。在这个例子中,脚本的责任是返回一个响应给客户端的有效的HTTP/1.0(或者HTTP/0.9)。
以下解析文件头:
脚本的输出是以一个小文件头开始的。这个文件头包含了文本行,这个文本行和HTTP文件头格式是一样的,它是以一个空行来结束的。任何的文件头(不是服务器指令)被直接发送给客户端。当前, 这个规范定义了三个服务器指令:
Content-type :这是一个你返回的文档的MIME类型。
Location :它用于指定你想返回引用的服务器给文档,而不是真正的文档。如果这个的参数为URL,服务器件将重定向到客户端。如果这个的参数是一个虚拟目录,服务器将检索指定的文档就象客户原来已经请求那个文档。?指令在这里将起作用,而#指令必须重定向到客户端。
Status :它将用于给服务器一个HTTP/1.0状态行以发送给客户端。它的格式为nnn xxxxx,其中nnn是一个三位数的状态码,而xxxx是原因字符串,比如"Forbidden"。
以下给出一些例子:
假如我有一个请求发送给HTML转换器。当转换器完成它的工作的时候,它将输出以下的内容到stdout中。
--- start of output ---
Content-type: text/html
--- end of output ---
这里注意有一个空白行在Content-type之后。
再给出另外一个例子,假如我有一个脚本,可以从这个服务器中返回文档/path/doc.txt,就象用户已经请求了http://server:port/path/doc.txt,脚本的输出为:
--- start of output ---
Location: /path/doc.txt
--- end of output ---
服务器件将执行这个请求并且将它发送给客户端。
另外,还有一个脚本可以引用我们的Gopher服务器。如果脚本想为用户提供gopher://gopher.ncsa.uiuc.edu/,它的输出为:
--- start of output ---
Location: gopher://gopher.ncsa.uiuc.edu/
--- end of output ---
最后,如果有一个脚本可以直接通知客户器。比如如果脚本是用HTTP/1.0的SERVER_PROTOCOL 来引用的,这个脚本就将输出以下的HTTP/1.0响应:
--- start of output ---
HTTP/1.0 200 OK
Server: NCSA/1.0a6
Content-type: text/plain
--- end of output ---