zoukankan      html  css  js  c++  java
  • [Apache手册]Linux环境下配置Apache运行cgi

    CGI动态页面

     CGI(公共网关接口)定义了web服务器与外部内容生成程序之间交互的方法,通常是指CGI程序或者CGI脚本,它是在网站上实现动态页面的最简单和常用的方法。本文将对如何在Apache web服务器上建立CGI以及如何编写CGI程序进行介绍。

    配置Apache以允许CGI

    要让CGI程序能正常运作,必须配置Apache以允许CGI的执行,

    第一步:配置Apache(httpd.conf)加载cgi模块,详细参考 Apache不重新编译,利用apxs工具给Apache添加模块,如cgi模块

    第二步:配置Apache(httpd.conf)设置cgi目录,如下方法之一:

    方法一:ScriptAlias

    ScriptAlias指令使Apache允许执行一个特定目录中的CGI程序。当客户端请求此特定目录中的资源时,Apache假定其中所有的文件都是CGI程序并试图运行它。

    ScriptAlias指令形如:

    ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/

    完整配置参考如下:

    <IfModule alias_module>
        ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
    </IfModule>
    
    <Directory "/usr/local/apache2/cgi-bin">
        AllowOverride None
        Options None
        Order allow,deny
        Allow from all  #千万别忘了这个配置
    </Directory>

    如果Apache被安装到默认位置,默认的配置文件httpd.conf中就会有上述配置。ScriptAliasAlias指令非常相似,都是定义了映射到一个特定目录的URL前缀,两者一般都用于指定位于DocumentRoot以外的目录,其不同之处是ScriptAlias又多了一层含义,即URL前缀后面的任何文件都被视为CGI程序。所以,上述例子会指示Apache:任何以/cgi-bin/开头的资源都将映射到/usr/local/apache2/cgi-bin/目录中,且视之为CGI程序。

    例如,如果有URL为http://www.example.com/cgi-bin/test.pl的请求,Apache会试图执行/usr/local/apache2/cgi-bin/test.pl文件并返回其输出。当然,这个文件必须存在而且可执行,并以特定的方法产生输出,否则Apache返回一个出错消息。

    方法二:ScriptAlias目录以外的CGI

    由于安全原因,CGI程序通常被限制在ScriptAlias指定的目录中,这样,管理员就可以严格控制谁可以使用CGI程序。但是,如果采取了恰当的安全措施,则没有理由不允许其他目录中的CGI程序运行。比如,你可能希望用户在UserDir指定的宿主目录中存放页面,而他们有自己的CGI程序,但无权访问cgi-bin目录,这样,就产生了运行其他目录中CGI程序的需求。

    允许CGI在任意目录执行需要两个步骤:

    #第一步:指定特定文件后缀为CGI文件(即,告诉服务器哪些文件是CGI文件)。

    有2种方法:方法一是定义MIME类型为application/x-httpd-cgi,方法二是使用 AddHandler SetHandler 指令

    例如,下面的AddHandler指令告诉服务器所有带有cgi或pl后缀的文件是CGI程序。(添加到配置文件的最后面即可)

    AddType application/x-httpd-cgi .cgi .pl #方法一
    AddHandler cgi-script .cgi .pl #方法二

    #第二步:设置CGI的目录属性,必须在Options指令中启用ExecCGI选项。

    可以在主配置文件中,使用Options指令显式地允许特定目录中CGI的执行:

    <Directory "/usr/local/apache2/cgi-bin">
    	Options ExecCGI
    	AllowOverride None
    	Order allow,deny
    	Allow from all
    </Directory>

    方法三:.htaccess文件

    .htaccess指南示范了怎样在没有权限修改httpd.conf文件的情况下激活CGI程序。

    #用户目录

    为了允许用户目录中所有以".cgi"结尾的文件作为CGI程序执行,你可以使用以下配置:

    <Directory /home/*/public_html>
        Options +ExecCGI
        AddHandler cgi-script .cgi
    </Directory>

    如果你想在用户目录中指定一个cgi-bin子目录,其中所有的文件都被当作CGI程序,你可以这样配置:

    <Directory /home/*/public_html/cgi-bin>
        Options ExecCGI
        SetHandler cgi-script
    </Directory> 

    #编写CGI程序 

    编写CGI程序和"常规"程序之间有两个主要的不同。

    首先,在CGI程序的所有输出前面必须有一个HTTP的MIME类型的头,对客户端指明所接收内容的类型,大多数情况下,像这样:

    Content-type: text/html

    其次,输出要求是HTML形式的,或者是浏览器可以显示的其他某种形式。多数情况下,输出是HTML形式的,但偶然也会输出一个gif图片或者其他非HTML的内容。

    除了这两点,编写CGI程序和编写其他程序大致相同。

    #第一个CGI程序

    这个CGI程序的例子在浏览器中打印一行文字。把下列存为first.pl文件,并放在你的cgi-bin目录中。

    #!/usr/bin/perl
    print "Content-type: text/html ";
    print "Hello, World.";

    即使不熟悉Perl语言,你也应该能看出它干了什么。第一行,告诉Apache这个文件可以用/usr/bin/perl(或者任何你正在使用的shell)解释并执行。第二行,打印上述要求的内容类型说明,并带有两个换行,在头后面留出空行,以示HTTP头的结束。第三行,打印文字"Hello, World."。程序到此结束。

    打开你喜欢的浏览器并输入地址:

    http://www.example.com/cgi-bin/first.pl

    或者是你存放程序的其他位置,就可以在浏览器窗口中看到一行:Hello, World. 。虽然并不怎么激动人心,但是一旦这个程序能正常运行,那么就可能运行其他任何程序。

    附:

    (1)Shell脚本cgi程序

    #!/bin/bash
    echo "Content-type: text/html"
    echo  # 注意,这行不能少
    echo "Hello, Shell.cgi"

    (2)Python脚本cgi程序

    #!/usr/bin/python
    print("Content-type: text/html
    ") // 末尾的换行符不能少
    print("Hello, Python.cgi")

    (3)使用任何语言编写都可以,只要程序可以正常执行,Apache就可以把输出原封不动的发给浏览器。

    更详细、更深入的教程,请看官方教程:http://lamp.linux.gov.cn/Apache/ApacheMenu/howto/cgi.html

  • 相关阅读:
    Python爬虫之selenium各种注意报错
    以后的路还很长
    巧学DBhelper
    怎么学习程序语言
    C# winform 实现图片轮播
    P6477 [NOI Online #2 提高组]子序列问题(民间数据) 题解
    NOI Online Round 2 TG 游记
    「EZEC」 Round1 开学信心赛 游记
    P6023 走路 题解
    P6022 快乐水 题解
  • 原文地址:https://www.cnblogs.com/52php/p/5669818.html
Copyright © 2011-2022 走看看