⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgi跟我学.htm

📁 很经典的CGI编程入门读物
💻 HTM
📖 第 1 页 / 共 5 页
字号:
下一步应该是测试我是否登陆,在这里我们用参数${1}代替我的名字lemay,&nbsp; ${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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "&lt;P&gt;$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 ueZ#G</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "&lt;P&gt;$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 "&lt;/BODY&gt;&lt;/HTML&gt;"</PRE>好了,让我们修改HTML页中的连接吧!原来是这样: <PRE>&lt;A HREF="http://www.lne.com/<B style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">cgi</B>-bin/pinglaura"&gt;Is Laura Logged in?&lt;/A&gt;</PRE>修改为通用查询功能后是这样,比如查询名字叫john的人是否登陆: 
<PRE>&lt;A HREF="http://www.lne.com/<B style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">cgi</B>-bin/pinggeneric?john"&gt;Is John Logged in?&lt;/A&gt;</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&amp;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">&amp;H$F#g!}1_,@\IGpH0</SPAN><BR><SPAN style="DISPLAY: none">?E!|7FQr1JQ1n0</SPAN>echo</PRE>这个Status头部提供状态码给服务器(并且也给浏览器). 
特别的204将传递给浏览器,如果能识别它,它将什么也不做. <SPAN 
style="DISPLAY: none">北京大学软件与微电子学院超级博客3@j&amp;?2iG$h)q8WZs</SPAN><BR>&nbsp; 
<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>脚本使用标签&lt;FORM&gt;属性调用的. 
</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>&lt;FORM ACTION="http://www.popchina.com/<B style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">cgi</B>-bin/processorscrīpt"&gt;</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>表单从浏览器发给服务器有两种方法.&nbsp; 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&amp;gender=male&amp;status=missing&amp;headless=yes</PRE>URL编码遵循下列规则: 

<UL>
  <LI>每对name/value由&amp;符分开.
  <LI>每对来自表单的name/value由=符分开. 如果用户没有输入值给这个name,那么这个name还是出现,只是无值(象这样 "name=").
  <LI>任何特殊的字符(就是那些不是简单的七位ASCII,如汉字) 将以百分符%用十六进制编码. 当然也包括象 =, &amp;, 和 % 这些特殊的字符.
  <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>&lt;FORM METHOD=POST ACTION="../<B style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">cgi</B>-bin/form-name"&gt;<SPAN style="DISPLAY: none">北京大学软件与微电子学院超级博客
}p,A&amp;{%[
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>&lt;/FORM&gt;</PRE>如果你在用uncgi从input中解码, 
情况有点不同. 为了是uncgi正常工作, 你首先必须调用uncgi , 如果uncgi是个目录,加上实际的脚本名, 象这样: <PRE>&lt;FORM METHOD=POST ACTION="../<B style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">cgi</B>-bin/uncgi/form-name"&gt;<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>&lt;/FORM&gt;</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~&amp;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&amp;k#?!V-m[4wR-g</SPAN><BR>echo "&lt;HTML&gt;&lt;HEAD&gt;"<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&amp;s)h5pf+]0</SPAN>echo "&lt;TITLE&gt;Hello&lt;/TITLE&gt;"<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 "&lt;/HEAD&gt;&lt;BODY&gt;"<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 "&lt;P&gt;"</PRE>接下来,有两种情况要处理:一件是处理用户不输入名字的情况,一个是如果输入了向他们说hello. 

<P>这个Name元素的值, 是包含在WWW_theName环境变量中. 用一个简单的测试命令(-z), 你能查看环境变量是否是空的还是包括相应的输出值: 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -