URL 编码
theName=Ichabod+Crane&gender=male&status=missing&headless=yesURL编码遵循下列规则:
- 每对name/value由&符分开.
- 每对来自表单的name/value由=符分开. 如果用户没有输入值给这个name,那么这个name还是出现,只是无值(象这样 "name=").
- 任何特殊的字符(就是那些不是简单的七位ASCII,如汉字) 将以百分符%用十六进制编码. 当然也包括象 =, &, 和 % 这些特殊的字符.
- 在输入区中的空格将以加号+显示.
练习3: 告诉我你的名字.
这个输入被发给脚本, 然后发回显示一个hello的信息(见图.6).
如果你在姓名输入处不输入任何东东,会怎样?见图7.
修改表单的HTML
现在我们举一个真实的例子:<FORM METHOD=POST ACTION="../cgi-bin/form-name"> </FORM>如果你在用uncgi从input中解码, 情况有点不同. 为了是uncgi正常工作, 你首先必须调用uncgi , 如果uncgi是个目录,加上实际的脚本名, 象这样:
<FORM METHOD=POST ACTION="../cgi-bin/uncgi/form-name"> </FORM>
脚本
在脚本中第一步是解码,在这个例子中, 我们已经使用uncgi解码输入数据, 实际这个表单已经为你做好解码. 通过建立一个uncgi的目录,一旦表单递交给服务器,服务器会自动进行解码,这样,所有的name/value已经准备就绪等待你的使用.
现在,一个例子开始部分假设是下面这样:
echo Content-type: text/html echo echo "<HTML><HEAD>" echo "<TITLE>Hello</TITLE>" echo "</HEAD><BODY>" echo "<P>"接下来,有两种情况要处理:一件是处理用户不输入名字的情况,一个是如果输入了向他们说hello.
这个Name元素的值, 是包含在WWW_theName环境变量中. 用一个简单的测试命令(-z), 你能查看环境变量是否是空的还是包括相应的输出值:
if [ ! -z "$WWW_theName" ]; then echo "Hello, " echo $WWW_theName else echo "You don't have a name?" fi最后增加一个连接"go back" . 用来返回:
echo "</P><P><A HREF="../lemay/name1.html">Go Back</A></P>" echo "</BODY></HTML>"
问题
- 脚本内容只显示不执行.
你正确配置了你的服务器运行CGI脚本? 你的脚本是放置在cgi-bin目录中吗?如果你的服务器允许带.cgi扩展名的CGI运行, 你的脚本文件名的扩展名是这样吗? - Error 500: Server doesn't support POST.
解答还是如上一条一样,然后你用命令行执行你的CGI,可以正常运行吗?是否有错误?. - Document contains no data.
确定你的头部行和数据部之间有一空行. - Error 500: Bad Script Request.
确定你的脚本是可执行的(在UNIX, 用chmod +x 你的脚本.cgi). 在从浏览器运行之前,你应当从命令行运行你的脚本,如果客户端是win95,可以用telnet登陆你的服务器,执行命令行,当然必须了解UNIX命令.
CGI变量
表2. CGI 环境变量.
环境变量 |
意义 |
| SERVER_NAME | CGI脚本运行时的主机名和IP地址. |
| SERVER_SOFTWARE | 你的服务器的类型如: CERN/3.0 或 NCSA/1.3. |
| GATEWAY_INTERFACE | 运行的CGI版本. 对于UNIX服务器, 这是CGI/1.1. |
| SERVER_PROTOCOL | 服务器运行的HTTP协议. 这里当是HTTP/1.0. |
| SERVER_PORT | 服务器运行的TCP口,通常Web服务器是80. |
| REQUEST_METHOD | POST 或 GET, 取决于你的表单是怎样递交的. |
| HTTP_ACCEPT | 浏览器能直接接收的Content-types, 可以有HTTP Accept header定义. |
| HTTP_USER_AGENT | 递交表单的浏览器的名称、版本 和其他平台性的附加信息。 |
| HTTP_REFERER | 递交表单的文本的 URL,不是所有的浏览器都发出这个信息,不要依赖它 |
| PATH_INFO | 附加的路径信息, 由浏览器通过GET方法发出. |
| PATH_TRANSLATED | 在PATH_INFO中系统规定的路径信息. |
| SCRIPT_NAME | 指向这个CGI脚本的路径, 是在URL中显示的(如, /cgi-bin/thescript). |
| QUERY_STRING | 脚本参数或者表单输入项(如果是用GET递交). QUERY_STRING 包含URL中问号后面的参数. |
| REMOTE_HOST | 递交脚本的主机名,这个值不能被设置. |
| REMOTE_ADDR | 递交脚本的主机IP地址. |
| REMOTE_USER | 递交脚本的用户名. 如果服务器的authentication被激活,这个值可以设置。 |
| REMOTE_IDENT | 如果Web服务器是在ident (一种确认用户连接你的协议)运行, 递交表单的系统也在运行ident, 这个变量就含有ident返回值. |
| CONTENT_TYPE | 如果表单是用POST递交, 这个值将是 application/x-www-form-urlencoded. 在上载文件的表单中, content-type 是个 multipart/form-data. |
| CONTENT_LENGTH | 对于用POST递交的表单, 标准输入口的字节数. |
表单输入的解码程序
uncgi
cgi-lib.pl
为了使用cgi-lib.pl,你通常要这样写:
#!/usr/lib/perl
require 'cgi-lib.pl';cgi-lib中尽管有很多子程序, 最重要的是ReadParse子程. ReadParse 读取输入方便地将name/value储存在一个Perl阵列中. 在你的Perl脚本中通常是这样调用的:
&ReadParse(*in);此例中,阵列名是in, 可以随便取名的.
在表单输入解码后, 你能读取和处理这个name/value,方法是象下面这样:
print $in{'theName'};这个将显示名字name是theName的值value.
