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

📄 cgi.html

📁 这个是我在web培训时老师提供的手册
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<h2><a name="troubleshoot" id="troubleshoot">程序还是不能运行!</a></h2>
    

    <p>使用浏览器从网络访问CGI程序,可能会发生四种情况:</p>

    <dl>
      <dt>CGI程序的输出</dt>
      <dd>太好了!这说明一切正常。如果输出正常但是浏览器处理出错,请确认你在CGI程序中使用了正确的 <code>Content-Type</code> 。</dd>

      <dt>CGI程序的源代码或者一个"POST Method Not Allowed"消息</dt>
      <dd>这说明Apache没有被正确配置以执行CGI程序,重新阅读<a href="#configuring">配置Apache</a>看看遗漏了什么。</dd>

      <dt>一个以"Forbidden"开头的消息</dt>
      <dd>这说明有权限问题。参考<a href="#errorlogs">Apache错误日志</a>和下面的<a href="#permissions">文件权限</a>。</dd>

      <dt>一个"Internal Server Error"消息</dt>
      <dd>查阅<a href="#errorlogs">Apache错误日志</a>,可以找到CGI程序产生的出错消息"Premature end of script headers"。对此,需要检查下列各项,以找出不能产生正确HTTP头的原因。</dd>
    </dl>

    <h3><a name="permissions" id="permissions">文件的权限</a></h3>
      

      <p>记住,服务器不是以你的用户身份运行的,在服务器启动后,拥有的是一个非特权用户的权限(通常是<code>nobody</code>或<code>www</code>)而需要更大的权限以允许文件的执行。通常,给予<code>nobody</code>足够的权限以执行文件的方法是,对文件赋予任何人皆可执行的权限:</p>

      <div class="example"><p><code>
        chmod a+x first.pl
      </code></p></div>

      <p>另外,如果需要对其他文件进行读取或写入,也必须对这些文件赋予正确的权限。</p>

    

    <h3><a name="pathinformation" id="pathinformation">路径信息和环境变量</a></h3>
      

      <p>当你在命令行执行一个程序,某些信息会自动传给shell而无须你操心,比如<code>PATH</code> ,告诉shell你所引用的文件可以在哪儿找到。</p>

      <p>但是,在CGI程序通过web服务器执行时,则没有此<code>PATH</code> ,所以,你在CGI程序中引用的任何程序(如<code>sendmail</code>)都必须指定其完整的路径,使shell能找到它们以执行你的CGI程序。</p>

      <p>一种普通的用法是,在CGI程序的第一行中指明解释器(通常是<code>perl</code>),形如:</p>

      <div class="example"><p><code>
        #!/usr/bin/perl
      </code></p></div>

      <p>必须保证它的确指向解释器。</p>

      <p>另外,如果CGI程序依赖于某些<a href="#env">环境变量</a>,你要确保所需要的变量已经正确的由Apache进行了传递。</p>

    

    <h3><a name="syntaxerrors" id="syntaxerrors">程序错误</a></h3>
      

      <p>多数CGI程序失败的原因在于程序本身有问题,尤其是在已经消除上述两种错误而CGI挂起的情况下。在用浏览器测试以前,先在命令行中执行你的程序,能够发现大多数的问题。比如:</p>

      <div class="example"><p><code>
      cd /usr/local/apache2/cgi-bin<br />
      ./first.pl
      </code></p></div>

      <p>(不要调用<code>perl</code>解释程序,因为shell和Apache会根据脚本第一行的<a href="#pathinformation">路径信息</a>找到解释器)</p>

      <p>你最先看到的输出内容应当是一组HTTP头,包括<code>Content-Type</code>和结尾的空行。如果你看到了别的什么东西,那么当你在服务器上试运行时,Apache会返回 <code>Premature end of script headers</code> 错误。参见上面的<a href="#writing">编写CGI程序</a>以获得更多信息。</p>
    

    <h3><a name="errorlogs" id="errorlogs">错误日志</a></h3>
      

      <p>错误日志是你的朋友。任何错误都会在错误日志中有所记载,所以你应该首先查看它。如果你的网站空间提供者不允许访问错误日志,那么你应该考虑换一个空间提供者。学会阅读错误日志,可以快速找出问题并快速解决。</p>
    

    <h3><a name="suexec" id="suexec">Suexec</a></h3>
      

      <p><a href="../suexec.html">suexec</a>允许CGI程序根据其所在虚拟主机或用户宿主目录的不同而以不同的用户权限运行。suexec有极其严格的权限校验,任何校验失败都会使CGI程序遭遇 <code>Premature end of script headers</code> 错误。</p>

      <p>为了检查你是否使用了suexec ,运行 <code>apachectl -V</code> 并检查<code>SUEXEC_BIN</code>的位置。如果Apache在启动时发现<code class="program"><a href="../programs/suexec.html">suexec</a></code>二进制文件正存在于此,那么suexec将会被激活。</p>

      <p>除非你很精通suexec,否则请不要使用它。要禁用它,只要删除(或重命名)<code>SUEXEC_BIN</code>所指定位置的<code class="program"><a href="../programs/suexec.html">suexec</a></code>二进制文件并重启服务器就可以了。如果你又想启用它,请首先阅读<a href="../suexec.html">suexec文档</a>以详细了解其运行机制,然后运行 <code>suexec -V</code> 命令找到suexec日志文件,并使用该日志文件找到你违反了哪条判断规则。</p>
    
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="behindscenes" id="behindscenes">幕后是怎样操作的?</a></h2>
    

    <p>当你的CGI编程逐渐深入,理解幕后的操作(尤其是浏览器和服务器之间是如何通讯的)就变得很有用了。因为虽然成功地写了一个程序打印"Hello, World",但并没有实际的用处。</p>

    <h3><a name="env" id="env">环境变量</a></h3>
      

      <p>环境变量是使用计算机时到处都会用到的变量,比如路径(对实际文件的一个搜索路径以补全你的输入)、你的用户名以及你的终端类型等等。在命令行输入 <code>env</code> ,可以得到当天标准的环境变量列表。</p>

      <p>在CGI处理过程中,服务器和浏览器都会设置环境变量,比如浏览器类型(Netscape、IE、Lynx)、服务器类型(Apache、IIS、WebSite)以及将要执行的CGI程序名称等等。</p>

      <p>所有这些变量对CGI程序员都有效,但只是客户端-服务器通讯的一半内容。完整的变量列表参见<a href="http://hoohoo.ncsa.uiuc.edu/cgi/env.html">http://hoohoo.ncsa.uiuc.edu/cgi/env.html</a></p>

      <p>这个简单的CGI程序列出了所有的环境变量,Apache发行版的<code>cgi-bin</code>目录中还有一个类似的程序。注意,有些变量是必须的,有些则是可选的,所以你可能会看见一些官方列表中没有的变量。另外,Apache有多种方法可以在默认提供的变量之外<a href="../env.html">增加你的专用环境变量</a>。</p>

      <div class="example"><p><code>
        #!/usr/bin/perl<br />
        print "Content-type: text/html\n\n";<br />
        foreach $key (keys %ENV) {<br />
        <span class="indent">
          print "$key --&gt; $ENV{$key}&lt;br&gt;";<br />
        </span>
        }
      </code></p></div>
    

    <h3><a name="stdin" id="stdin">STDIN 和 STDOUT</a></h3>
      

      <p>服务器和客户端之间的其他通讯都通过标准输入设备(<code>STDIN</code>)和标准输出设备(<code>STDOUT</code>)完成。通常,<code>STDIN</code>是指键盘或者一个程序所作用的一个文件,<code>STDOUT</code>指控制台或显示器。</p> 

      <p>当你<code>POST</code>一个网络表格到一个CGI程序时,表格中的数据被捆扎为一个特殊形式通过<code>STDIN</code>传送给CGI程序,这样,这个程序就可以处理这些数据,仿佛这些数据是来自键盘或者一个文件。</p>

      <p>这种"特殊形式"很简单,一个字段名称及其值,中间用等号(=)连接,多个这样的字段对用与符号(&amp;)连接。非常规字符,如空格、"&amp;"号和"="号,被转换为其等值的十六进制以免出问题。整个字符串形如:</p>

      <div class="example"><p><code>
        name=Rich%20Bowen&amp;city=Lexington&amp;state=KY&amp;sidekick=Squirrel%20Monkey
      </code></p></div>

      <p>有时,你会发现URL后面也会带有这样的字符串。这种形式会使服务器以这个字符串的内容设置环境变量<code>QUERY_STRING</code> ,称为<code>GET</code>请求。你的HTML表格在<code>FORM</code>标签中设置<code>METHOD</code>属性,以指定传送数据的动作使用<code>GET</code>或<code>POST</code> 。</p>

      <p>你的程序必须把这个字符串分解以获得有用信息。所幸,有库和模块可以帮助你处理这些数据,还有为你的CGI程序达成其他目的的处理器。</p>
    
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="libraries" id="libraries">CGI模块/库</a></h2>
    

    <p>编写CGI程序时,你应该考虑使用代码库或模块来完成大多数琐碎的工作,以减少错误并更快地开发。</p>

    <p>如果用Perl语言编写CGI程序,可用的模块见<a href="http://www.cpan.org/">CPAN</a> ,最常用的模块是<code>CGI.pm</code> 。也可以考虑用<code>CGI::Lite</code> ,它实现了一个在多数程序中所有必须的最小功能集。</p>

    <p>如果用C语言编写CGI程序,则有很多选择,其中之一是<code>CGIC</code>库,来自<a href="http://www.boutell.com/cgic/">http://www.boutell.com/cgic/</a></p>
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="moreinfo" id="moreinfo">更多信息</a></h2>
    

    <p>网上有大量的CGI资源。可以在Usenet组<a href="news:comp.infosystems.www.authoring.cgi">comp.infosystems.www.authoring.cgi</a>和别人讨论CGI相关问题。HTML Writers Guild 的邮件列表是一个优秀的问题解答资源。更多资源在<a href="http://www.hwg.org/lists/hwg-servers/">http://www.hwg.org/lists/hwg-servers/</a></p>

    <p>另外,还可以阅读CGI规范,其中有CGI程序操作的所有细节,原始版本见<a href="http://hoohoo.ncsa.uiuc.edu/cgi/interface.html">NCSA</a> ,另有一个更新草案见<a href="http://web.golux.com/coar/cgi/">Common Gateway Interface RFC project</a></p>

    <p>当你向一个邮件列表或者新闻组提交CGI相关问题时,你应该确保提供了足够的信息以更容易地发现并解决问题,诸如:发生了什么事、你希望得到什么结果、结果与你所期望的有什么出入、你运行的服务器、CGI程序是用什么语言编写的、如果可能就提供那个讨厌的代码。</p>

    <p>注意,<strong>不要</strong>把CGI相关问题提交到Apache bug数据库,除非你坚信发现的是Apache源代码中的问题。</p>
  </div></div>
<div id="footer">
<p class="apache">本文允许自由使用、分发、转载,但必须保留译者署名;详见:<a href="../translator_announcement.html#announcement">译者声明</a>。</p>
<p class="menu"><a href="../mod/index.html">模块索引</a> | <a href="../mod/directives.html">指令索引</a> | <a href="../faq/index.html">常见问题</a> | <a href="../glossary.html">词汇表</a> | <a href="../sitemap.html">站点导航</a></p></div>
</body></html>

⌨️ 快捷键说明

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