📄 cgi跟我学.htm
字号:
下一步应该是测试我是否登陆,在这里我们用参数${1}代替我的名字lemay, ${1}作为第一个参数, ${2}作为第二个, ${3}作为第三个. <PRE>ison='who | grep "${1}"'</PRE>
<HR align=center>
<HR align=center>
<P>剩下的所有修改如下: </P><PRE>if [ ! -z "$ison" ]; then<BR><SPAN style="DISPLAY: none">+]1RQ3hk0</SPAN><BR><SPAN style="DISPLAY: none">f$K%yj$p hR` Y0</SPAN><BR><SPAN style="DISPLAY: none">xTA5wh{0</SPAN> echo "<P>$1 is logged in"<SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客FR peWrO.E</SPAN><BR><SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客.\n#oL
h(_Dl</SPAN><BR><BR><SPAN style="DISPLAY: none">;S
rRS6fW0</SPAN>else<SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客o-u Me
ugZT</SPAN><BR><SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客g?;WmI$z"_</SPAN><BR><SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客`.g ueZ#G</SPAN><BR> echo "<P>$1 isn't logged in"<SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客(y z/O,}3a'G$yX*^</SPAN><BR><SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客h8hb
J._d6Gv</SPAN><BR><BR><SPAN style="DISPLAY: none">)}?^~8I6rP0</SPAN>fi</PRE><PRE>echo "</BODY></HTML>"</PRE>好了,让我们修改HTML页中的连接吧!原来是这样: <PRE><A HREF="http://www.lne.com/<B style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">cgi</B>-bin/pinglaura">Is Laura Logged in?</A></PRE>修改为通用查询功能后是这样,比如查询名字叫john的人是否登陆:
<PRE><A HREF="http://www.lne.com/<B style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">cgi</B>-bin/pinggeneric?john">Is John Logged in?</A></PRE>
<CENTER>在你的服务器上试试,看是否有结果。 </CENTER>
<CENTER>
<H4><A id=I18 name=I18
_base_href="http://www.jdon.com/idea/cgi.htm"></A><B><FONT
size=+0>传递其他信息给脚本</FONT></B></H4></CENTER>有第二种方法传递信息给<B
style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">CGI</B>脚本. 它叫作路径信息path
information 用作那些在脚本调用是不用变更的参数, 象一个临时文件名或调用脚本自己的文件名.
正如你看到的,在上面的例子问号后面的参数是因用户表单的输入而改变的. 路径信息Path info用作其他信息传递给脚本,实际上,你可以用它作任何事情.
<SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客/\9|9a-@|a6\</SPAN><BR>
<HR align=center>
<NOTE></NOTE>
<P>路径信息Path information是一种不象通常参数脚本那样频繁传递信息的方法. 路径Path
information通常是指Web服务器上的那些比如<B
style="COLOR: black; BACKGROUND-COLOR: rgb(160,255,255)">配置</B>文件、临时文件或者被脚本因问题调用的文件等等此类文件.
<SPAN
style="DISPLAY: none">北京大学软件与微电子学院超级博客n`/X(F&N5]|$Kd</SPAN><BR></P>
<HR align=center>
<P>看下面一个路径信息path information例子, : </P><PRE>http://myhost/<B style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">cgi</B>-bin/myscrīpt/remaining_path_info?arg1+arg2</PRE>当脚本运行时,在路径中的信息将被放置于环境参数PATH_INFO.
你能在你的脚本内容中使用这些信息.
<P>比如说, 让我们假设你在多页上已有多个连接到同一个脚本. 你能用这个路径信息显示那个有连接的HTML文件名. 这样, 在你完成处理你的脚本之后,
当你发回一个HTML文件时, 你能在这个文件里包含一个连接,发回用户一开始那个页。 </P>
<P></P>
<CENTER>你会在下一章节学到更多路径信息:有用的表单和脚本. 待后来登出 </CENTER>
<CENTER>
<H3><A id=I19 name=I19
_base_href="http://www.jdon.com/idea/cgi.htm"></A><B><FONT
size=+1>创建一个特殊的脚本输出</FONT></B></H3></CENTER>现在你已经学习了诸如输出数据 一般地HTML数据
发给浏览器解释显示的数据. 但是如果你不想把脚本结果作为一个数据流形式发回浏览器,而是想把一个存在的页发回,怎么办?
如果你只是要脚本做一些事而不让任何结果回答给浏览器,怎么办?
<P></P>
<CENTER>不用怕, 这里开始解释这些情况. </CENTER>
<CENTER>
<H4><A id=I20 name=I20
_base_href="http://www.jdon.com/idea/cgi.htm"></A><B><FONT
size=+0>用调用另一个文本作为响应</FONT></B></H4></CENTER><B
style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">CGI</B>输出不是非得一个数据流,有时可以告诉浏览器是存在服务器上的一个页,为了发出这个信息,看下面的例子:
<PRE>Location: ../docs/final.html</PRE>这个Location行用作通常的输出位置,也就是说,如果你用了Location,
你就不必再用象Content-type这样的数据输出(实际上,你也不能). 正如Content-type, 你也必须在这一行后面跟一个空行.
<P>指向这个文件的路径可以是一个URL或相对路径. 所有相对路径是指相对于脚本所在的位置.
例子中的final.html文本是在当前上一个目录下docs的目录下: </P><PRE>echo Location: ../docs/final.html<BR><SPAN style="DISPLAY: none">;[L~$Ot
D W0</SPAN><SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客-Q,X'rC+rQ$P</SPAN><BR><SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客.I/k3M;MMO3ZU</SPAN><BR>echo</PRE>
<HR align=center>
<NOTE></NOTE>
<P>你不能Content-type 和 Location两个输出同时使用. 比如, 如果你想输出一个标准页,但是想在这个页尾加上客户的内容,
你就得用Content-type自行组建这两个部分. 注意:你可以用脚本命令打开一个当地文件作为数据直接将之输出. <BR><SPAN
style="DISPLAY: none">M0S?wt,t$^O0</SPAN> <SPAN
style="DISPLAY: none">北京大学软件与微电子学院超级博客8ZD6R#@A[R2D</SPAN><BR></P>
<HR align=center>
<CENTER>
<H4><A id=I21 name=I21
_base_href="http://www.jdon.com/idea/cgi.htm"></A><B><FONT size=+0>No
Response</FONT></B></H4></CENTER>有时对于一个<B
style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">CGI</B>脚本也许一点没有输出.
有时你只是要从用户那儿收集点信息. 你就不用再调用一个新文本, 也不用输出结果或打开一个存在的文件. 在浏览器上的屏幕还是那个样子.
<P>很幸运, 这一切很容易. 你只要输出下面这个命令即可(后面跟一个空行): </P><PRE>echo Status: 204 No Response<BR><SPAN style="DISPLAY: none">N:n_}-F0</SPAN><BR><SPAN style="DISPLAY: none">&H$F#g!}1_,@\IGpH0</SPAN><BR><SPAN style="DISPLAY: none">?E!|7FQr1JQ1n0</SPAN>echo</PRE>这个Status头部提供状态码给服务器(并且也给浏览器).
特别的204将传递给浏览器,如果能识别它,它将什么也不做. <SPAN
style="DISPLAY: none">北京大学软件与微电子学院超级博客3@j&?2iG$h)q8WZs</SPAN><BR>
<P></P>
<HR align=center>
<NOTE></NOTE>
<P>尽管无响应是一个官方HTTP规定的一部分,但也并不是适合所有的浏览器,也许会产生奇怪的结果,那你要多试验试试看啦. <BR><SPAN
style="DISPLAY: none">5x?#~)n+S)u4M%m7q!vH n0</SPAN> <SPAN
style="DISPLAY: none">北京大学软件与微电子学院超级博客 vGOfG Tggw</SPAN><BR></P>
<HR align=center>
<CENTER>
<H3><A id=I22 name=I22
_base_href="http://www.jdon.com/idea/cgi.htm"></A><B><FONT
size=+1>处理表单的脚本</FONT></B></H3></CENTER>今天,大多数<B
style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">CGI</B>脚本是用来处理表单输入的.
这个过程大致象上面说阐述的一样,但还是有些不同,比如<B
style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">CGI</B>脚本只要被调用;数据怎样从服务器被发向浏览器.
<P></P>
<CENTER>记住, 大多数表单有两个部分: HTML的表单格式;处理表单数据的<B
style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">CGI</B>脚本. 这个<B
style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">CGI</B>脚本使用标签<FORM>属性调用的.
</CENTER>
<CENTER>
<H4><A id=I23 name=I23
_base_href="http://www.jdon.com/idea/cgi.htm"></A><B><FONT
size=+0>表单形式和表单脚本</FONT></B></H4></CENTER>正如上面所说,由于表单有两个部分. 如下:
<P>这个ACTION属性包含着处理表单的脚本: </P><PRE><FORM ACTION="http://www.popchina.com/<B style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">cgi</B>-bin/processorscrīpt"></PRE>
<CENTER>在这个表单中, 每个输入区都有一个NAME的属性, 用来称呼表单元素. 当这个表单数据被递交给你在ACTION中定义的<B
style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">CGI</B>脚本,
这样这些name和输入内容被作为一个数字或字符传递给脚本. </CENTER>
<CENTER>
<H4><A id=I24 name=I24
_base_href="http://www.jdon.com/idea/cgi.htm"></A><B><FONT size=+0>GET 和
POST</FONT></B></H4></CENTER>表单从浏览器发给服务器有两种方法. GET 和 POST.
<P>我们上面谈论的方法,实际是GET,它将数据打包放置在环境变量QUERY_STRING中作为URL整体的一部分传递给服务器。 </P>
<P>POST做很多类似GET同样的事情, 不同的地方就是它是分离地传递数据给脚本. 你的脚本通过标准输入获取这些数据.
(有些Web服务器是存储在临时文件中.) 这个QUERY_STRING环境变量将不再设置. </P>
<P>那你用那个方法呢? POST是个安全的方法, 尤其如果你的表单中有很多数据的话. 当你用GET,
这个服务器就分配变量QUERY_STRING给所有的表单数据, 但是这个变量可存储量是有限的. 换句话说,如果你有很多数据但是你又用GET,你会丢失很多数据.
</P>
<P></P>
<CENTER>如果你用POST, 你可以尽可能多地使用数据, 因为这些数据从来也不分配到一个变量里. </CENTER>
<CENTER>
<H4><A id=I25 name=I25
_base_href="http://www.jdon.com/idea/cgi.htm"></A><B><FONT size=+0>URL
编码</FONT></B></H4></CENTER>URL 编码是一种浏览器用来打包表单输入的格式. 浏览器从表单中获取所有的name和其中的值
,将他们作为name/value参数编码, 移去那些不能传送的字符,
将数据排行等等,这些还取决于你用GET还是POST?作为URL的一部分或者分离地发给服务器. 不管哪种情况, 在服务器端的表单输入格式样子象这样: <PRE>theName=Ichabod+Crane&gender=male&status=missing&headless=yes</PRE>URL编码遵循下列规则:
<UL>
<LI>每对name/value由&符分开.
<LI>每对来自表单的name/value由=符分开. 如果用户没有输入值给这个name,那么这个name还是出现,只是无值(象这样 "name=").
<LI>任何特殊的字符(就是那些不是简单的七位ASCII,如汉字) 将以百分符%用十六进制编码. 当然也包括象 =, &, 和 % 这些特殊的字符.
<LI>在输入区中的空格将以加号+显示.</LI></UL>因为表单输入是用这个URL编码传递给你的脚本的,在你用这些参数之前必须解码,因为解码是个很普遍的工作,可以有很多工具做这个工作
. 你没有必要自己写这个解码程序.
<P></P>
<CENTER>这里介绍一个叫uncgi的解码程序, 你可以从<A
href="http://www.hyperion.com/~koreth/uncgi.html"
_base_href="http://www.jdon.com/idea/cgi.htm">http://www.hyperion.com/~koreth/uncgi.html</A>.
得到原码,安装在你自己的<B
style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">cgi</B>-bin目录下.
</CENTER>
<CENTER>
<H5><A id=I26 name=I26
_base_href="http://www.jdon.com/idea/cgi.htm"></A><B><FONT size=+0>练习3:
告诉我你的名字.</FONT></B></H5></CENTER>让我们以这个例子来说明,如图5.
<P><IMG height=205 alt="19twp05.gif (16423 字节)" src="CGI跟我学.files/19twp05.gif"
width=507 _base_href="http://www.jdon.com/idea/cgi.htm"> </P>
<P>这个输入被发给脚本, 然后发回显示一个hello的信息(见图.6). </P>
<P><IMG height=205 alt="19twp07.gif (14688 字节)" src="CGI跟我学.files/19twp07.gif"
width=506 _base_href="http://www.jdon.com/idea/cgi.htm"> </P>
<P>如果你在姓名输入处不输入任何东东,会怎样?见图7. </P>
<P><IMG height=205 alt="19twp06.gif (14812 字节)" src="CGI跟我学.files/19twp06.gif"
width=506 _base_href="http://www.jdon.com/idea/cgi.htm"> </P>
<H6><B><FONT size=+0>修改表单的HTML</FONT></B></H6>现在我们举一个真实的例子: <PRE><FORM METHOD=POST ACTION="../<B style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">cgi</B>-bin/form-name"><SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客
}p,A&{%[
p^N;E</SPAN><BR><BR><SPAN style="DISPLAY: none">7Vvk#PV~!f)dGzE}4]0</SPAN><BR><SPAN style="DISPLAY: none">X%fb0Gfyg _0</SPAN></FORM></PRE>如果你在用uncgi从input中解码,
情况有点不同. 为了是uncgi正常工作, 你首先必须调用uncgi , 如果uncgi是个目录,加上实际的脚本名, 象这样: <PRE><FORM METHOD=POST ACTION="../<B style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">cgi</B>-bin/uncgi/form-name"><SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客TSklNB-j1S</SPAN><BR><SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客;hqm)@9\)U;S[\0Kcg</SPAN><BR><BR><SPAN style="DISPLAY: none">{ou:O](wEL+kJ0</SPAN></FORM></PRE>
<CENTER>这样,你不必修改表单中原始的HTML; 原始的HTML可以工作得很好. </CENTER>
<CENTER>
<H6><B><FONT size=+0>脚本</FONT></B></H6></CENTER>处理表单输入的是个<B
style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">CGI</B>脚本, 让我们来仔细地看看。
<P>在脚本中第一步是解码,在这个例子中, 我们已经使用uncgi解码输入数据, 实际这个表单已经为你做好解码.
通过建立一个uncgi的目录,一旦表单递交给服务器,服务器会自动进行解码,这样,所有的name/value已经准备就绪等待你的使用. </P>
<P>现在,一个例子开始部分假设是下面这样: </P><PRE>echo Content-type: text/html<BR><SPAN style="DISPLAY: none">TW|d%a~&v9rZ0</SPAN><SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客.z)nb:xXoWFj_6^</SPAN><BR><SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客dTM2st</SPAN><BR>echo<SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客1r4[u8~(z</SPAN><BR><BR><SPAN style="DISPLAY: none">Ab)L[0ogM9R0</SPAN><SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客*s&k#?!V-m[4wR-g</SPAN><BR>echo "<HTML><HEAD>"<SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客_.b,QKT:J</SPAN><BR><SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客+si-l:J#O</SPAN><BR><BR><SPAN style="DISPLAY: none">j+ajL&s)h5pf+]0</SPAN>echo "<TITLE>Hello</TITLE>"<BR><SPAN style="DISPLAY: none"> p#E#|?/Pu!S0</SPAN><SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客o3~h(M*a{</SPAN><BR><SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客lJt$?5Q q</SPAN><BR>echo "</HEAD><BODY>"<SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客;`4pt-S7Q'Kn</SPAN><BR><SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客^'uT"isj.A</SPAN><BR><BR><SPAN style="DISPLAY: none">Y,U2D9j.B~6L)``^0</SPAN>echo "<P>"</PRE>接下来,有两种情况要处理:一件是处理用户不输入名字的情况,一个是如果输入了向他们说hello.
<P>这个Name元素的值, 是包含在WWW_theName环境变量中. 用一个简单的测试命令(-z), 你能查看环境变量是否是空的还是包括相应的输出值:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -